본문 바로가기

코드 디자인 패턴/java

[java & 디자인 패턴] Bridge 패턴 정리

개념


하위 구상 클래스에 무언가를 추가하는 경우, 크게 두 가지 경우가 있다.

  • 추상화 클래스 계층 | 새 기능을 추가하는 부분
  • 구현 클래스 계층 | 추상화된 메소드에서 실제로 호출되는 기본 단위 작업 로직

브릿지 패턴은 클래스의 추상화 계층과 구현 계층을 분리해서 각자가 독립적으로 변형이 가능하도록 한다.

이 방법은 상속 대신 컴포지션(래핑)을 사용하여 구현을 위임하며 추상화 계층은 구현 계층에 대한 참조를 통해 구현 계층의 메서드를 호출합니다.

 

장점

느슨한 결합 | 추상화 계층과 구현 계층을 분리함으로써 가독성이 향상되고, 어느 한쪽을 변형할 때 다른 한쪽은 독립적이다. 따라서 복잡한 시스템에서 각 기능과 추상화 부분을 유지보수할 때 유리하다.

유연성 | 추상화를 위한 구현 메소드의 조합이 비교적 자유로워진다.

 

단점

복잡성 증가 | 계층 분리를 통해 코드가 복잡해진다

 

구현


 

음악을 재생하고 가수가 노래를 부르는 콘서트 프로그램을 가정하자.

 

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");
	}

}