반응형

브릿지 패턴(Bridge Pattern)


브릿지 패턴은 아래와 같이 정의한다.

 

"구현(implementation)으로부터 추상(abstraction) 레이어를 분리하여 이 둘이 서로 독립적으로 변화할 수 있도록 한다." 

 

"구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 한다. 

즉 기능과 구현에 대해서 두 개를 별도의 클래스로 구현을 한다."

 

"두개의 다른 계층(하나는 추상, 하나는 구현인 서로다른 계층의 커플링을 약화시키며 협력은 가능하도록 하는 패턴"

 

 

 

브릿지 패턴 클래스 다이어그램

 

 

Abstraction 

기능 계층의 최상위 클래스이며 추상 인터페이스를 정의한다.  Implementor에 대한 레퍼런스를 유지한다.
- 구현 부분에 해당하는 클래스를 인스턴스를 가지고 해당 인스턴스를 통해 구현부분의 메서드를 호출한다.

 
RefinedAbstraction

- Abstraction에 의해 정의된 인터페이스를 확장한다.(extends)
- 기능 계층에서 새로운 부분을 확장한 클래스이다.


Implementor 

- 구현 클래스를 위한 인터페이스를 정의한다.
- Abstraction의 기능을 구현하기 위한 인터페이스 정의한다.


ConcreteImplementor 

- Implementor 인터페이스를 구현 즉, 실제 기능을 구현한다.

 

 

 

브릿지 패턴 예제

 

아래의 다이어그램을 보면 훨씬 더 쉽게 이해 할 수 있다.

 

 

Shape 추상 클래스

draw만 추상 메서드이고 그 외에는 추후 나올 Drawing 인터페이스의 메서드를 따르도록 되어있다.

 

이때 구현부는 인터페이스로 모두 위임(Delegation)함으로써 브릿지 패턴의 특성을 나타내고있다.

 

package BridgePattern;

public abstract class Shape {
	private Drawing drawing;
	
	protected Shape(Drawing drawing) {
		this.drawing = drawing;
	}
	
	public abstract void draw();
	public void drawLine(int x, int y) {
		drawing.drawLine(x, y);
	}
	public void fill() {
		drawing.fill();
	}
}

 

 

Rectangle 클래스

package BridgePattern;

public class Rectangle extends Shape{
	protected Rectangle(Drawing drawing) {
		super(drawing);
	}

	@Override
	public void draw() {
		System.out.println("Rect draw extend");
	}
}

 

 

Circle 클래스

package BridgePattern;

public class Circle extends Shape{
	protected Circle(Drawing drawing) {
		super(drawing);
	}

	@Override
	public void draw() {
		System.out.println("Rect draw extend");
	}
}

 

 

Drawing 인터페이스

package BridgePattern;

public interface Drawing {
	public void drawLine(int x, int y);
	public void fill();
}

 

 

RectDrawing 클래스

package BridgePattern;

public class RectDrawing implements Drawing{
	@Override
	public void drawLine(int x, int y) {
		System.out.println("Rect Draw line from " + x + " to " + y);
	}
	
	@Override
	public void fill() {
		System.out.println("Rect Fill!");
	}
}

 

 

CircleDrawing 클래스

package BridgePattern;

public class CircleDrawing implements Drawing{
	@Override
	public void drawLine(int x, int y) {
		System.out.println("Circle Draw line from " + x + " to " + y);
	}
	
	@Override
	public void fill() {
		System.out.println("Circle Fill!");
	}
}

 

 

BridgeMain 클래스

package BridgePattern;

public class BridgeMain {
	public static void main(String[] args) {
		Shape rectangle = new Rectangle(new RectDrawing());
		Shape circle = new Circle(new CircleDrawing());
		
		rectangle.drawLine(1, 2);
		rectangle.fill();
		rectangle.draw();
		
		System.out.println();
		
		circle.drawLine(3, 4);
		circle.fill();
		circle.draw();
	}
}

 

 

 

브릿지 패턴과 어댑터 패턴의 차이

 

두 패턴 모두 Interface의 detail을 감추고자 하며, 구조적인 차이가 없다.

 

하지만 두 패턴은 서로 사용하고자 하는 목적의 차이가 분명하다.

 

- 어댑터는 어떤 클래스의 인터페이스가 다른 코드에서 기대하는 것과 다를 때(기능은 같은 데, 함수명이 다를 때) 어댑터를 중간에 두어 맞춰주는 것이다.

- 브릿지는 추상과 구현을 분리하는 것이다.(추상 클래스는 추상 클래스 대로, 구현은 구현 대로 변경해도 서로 영향을 주지 않도록 한다.)

- 어댑터는 결국 어떤 코드에 맞게끔 기존의 코드를 쓰기 위해 사용되고, 브릿지는 확장성을 고려하여 미리 예상하여 bridge class를 구현해 코드 작성시 사용되어진다.

 

 

 

https://donxu.tistory.com/entry/%EB%B8%8C%EB%A6%BF%EC%A7%80-%ED%8C%A8%ED%84%B4-Bridge-pattern

https://lktprogrammer.tistory.com/35

반응형

'Applied > Design Pattern' 카테고리의 다른 글

MVC 패턴(Model View Controller Pattern)  (0) 2019.07.20
상태 패턴(State Pattern)  (0) 2019.07.18
어댑터 패턴(Adapter Pattern)  (0) 2019.07.10
팩토리 패턴(Factory Pattern)  (0) 2019.07.09
중재자 패턴(Mediator Pattern)  (0) 2019.07.07