개념
하위 구상 클래스에 무언가를 추가하는 경우, 크게 두 가지 경우가 있다.
- 추상화 클래스 계층 | 새 기능을 추가하는 부분
- 구현 클래스 계층 | 추상화된 메소드에서 실제로 호출되는 기본 단위 작업 로직
브릿지 패턴은 클래스의 추상화 계층과 구현 계층을 분리해서 각자가 독립적으로 변형이 가능하도록 한다.
이 방법은 상속 대신 컴포지션(래핑)을 사용하여 구현을 위임하며 추상화 계층은 구현 계층에 대한 참조를 통해 구현 계층의 메서드를 호출합니다.
장점
느슨한 결합 | 추상화 계층과 구현 계층을 분리함으로써 가독성이 향상되고, 어느 한쪽을 변형할 때 다른 한쪽은 독립적이다. 따라서 복잡한 시스템에서 각 기능과 추상화 부분을 유지보수할 때 유리하다.
유연성 | 추상화를 위한 구현 메소드의 조합이 비교적 자유로워진다.
단점
복잡성 증가 | 계층 분리를 통해 코드가 복잡해진다
구현
음악을 재생하고 가수가 노래를 부르는 콘서트 프로그램을 가정하자.
Implementor (구현자):
구현 클래스에 대한 인터페이스 정의
public interface ISinger {
public String downloadMusic(String music);
public void playMusic();
public void sing();
}
ConcreteImplementor (구체적인 구현자)
Implementor 인터페이스를 구현한 기능 계층 클래스
public class Singer1 implements ISinger{
public String music;
@Override
public String downloadMusic(String music) {
// TODO Auto-generated method stub
if(music !=null) {
System.out.println("음악을 다운로드 합니다: "+music);
}
this.music =music;
return music;
}
@Override
public void playMusic() {
// TODO Auto-generated method stub
System.out.println("음악을 재생합니다: "+this.music);
}
@Override
public void sing() {
// TODO Auto-generated method stub
System.out.println("노래를 부릅니다");
}
}
Abstraction (추상화)
추상 클래스나 인터페이스로 정의되며, 구현 객체에 대한 참조를 포함
public abstract class ABSConcert {
protected ISinger singer;
public ABSConcert(ISinger iSinger) {
// TODO Auto-generated constructor stub
this.singer = iSinger;
}
public abstract void startConcert(String music);
}
RefinedAbstraction (세부 추상화)
추상화 인터페이스의 구현 클래스로, 구체적 구현자를 참조하여 추상화 메소드 구현
public class Concert1 extends ABSConcert{
public Concert1(ISinger iSinger) {
super(iSinger);
// TODO Auto-generated constructor stub
}
@Override
public void startConcert(String music) {
// TODO Auto-generated method stub
this.singer.downloadMusic(music);
this.singer.playMusic();
this.singer.sing();
}
}
사용 예시
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
ISinger singer1 = new Singer1();
ABSConcert concert1 = new Concert1(singer1);
// 구현부 로직을 추상화한 메서드 호출
concert1.startConcert("let it be");
}
}
'코드 디자인 패턴 > java' 카테고리의 다른 글
[java & 디자인 패턴] Strategy 패턴 정리 (0) | 2024.07.17 |
---|---|
[java & 디자인 패턴] Decorator 패턴 정리 (0) | 2024.07.17 |
[java & 디자인 패턴] Facade 패턴 정리 (0) | 2024.07.17 |
[java & 디자인 패턴] Adapter 패턴 정리 (0) | 2024.07.14 |
[java & 디자인 패턴] Observer 패턴 학습 정리 (0) | 2024.07.14 |