[디자인 패턴][구조 패턴] 가교 패턴(Bridge Pattern)
Updated:
1. 개요
구현부에서 추상층을 분리하여 독립적으로 다양성을 가질 수 있도록 하는 패턴
가교 패턴(Bridge Pattern)은 구조 패턴(Structural Pattern)의 한 종류로, 구현과 추상을 분리하여 재사용성을 높이고, 컴파일 시점이 아닌 런타임 시점에 구현체를 선택하도록 하여 유연한 설계가 가능하도록 하는 패턴이다.
2. 구조 패턴(Structural Pattern)
2-1. 구조 패턴이란?
구조 패턴이란 작은 클래스들의 상속과 합성을 통해 더 큰 클래스를 생성하는 방법을 제공하는 패턴으로, 독립적으로 개발한 클래스들을 마치 하나인 것 처럼 사용할 수 있다.
2-2. 구조 패턴 종류
3. 구성
[출처 : GoF의 디자인 패턴]
-
Abstraction : 기능 계층의 최상위 클래스로, 기능을 정의한 인터페이스
-
RefinedAbstraction : Abstraction 인터페이스를 확장한 클래스
-
Implementor : Abstraction의 기능을 구현하기 위한 인터페이스
-
ConcreteImplementor : Implementor 인터페이스를 구현한 클래스
4. 예제 코드
삼성 선풍기와 LG 선풍기를 리모컨으로 동작 가능하도록 기능을 확장한다고 가정해보자. 추상 클래스를 확장하여 리모컨 동작 기능을 추가하고, 기존에 구현한 선풍기 클래스와 연결해주어야 한다.
4-1. Implementor
[Fan.java]
1
2
3
4
5
public interface Fan {
void turnOn();
void turnOff();
}
4-2. ConcreteImplementor
[SamsungFan.java]
1
2
3
4
5
6
7
8
9
10
11
12
public class SamsungFan implements Fan {
@Override
public void turnOn() {
System.out.println("Turn on samsung fan");
}
@Override
public void turnOff() {
System.out.println("Turn off samsung fan");
}
}
[LgFan.java]
1
2
3
4
5
6
7
8
9
10
11
12
public class LgFan implements Fan {
@Override
public void turnOn() {
System.out.println("Turn on lg fan");
}
@Override
public void turnOff() {
System.out.println("Turn off lg fan");
}
}
4-3. Abstraction
[Device.java]
1
2
3
4
5
public interface Device {
void turnOn();
void turnOff();
}
4-4. RefinedAbstraction
[RemoteDevice.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class RemoteDevice implements Device {
private Fan fan;
public RemoteDevice(Fan fan) {
this.fan = fan;
}
@Override
public void turnOn() {
System.out.println("Use remote control");
fan.turnOn();
}
@Override
public void turnOff() {
System.out.println("Use remote control");
fan.turnOff();
}
}
5. 테스트
[Clinet.java]
1
2
3
4
5
6
7
8
9
10
11
12
public class Client {
public static void main(String[] args) {
Device device1 = new RemoteDevice(new SamsungFan());
device1.turnOn();
device1.turnOff();
Device device2 = new RemoteDevice(new LgFan());
device2.turnOn();
device2.turnOff();
}
}
[실행 결과]
6. 특징
-
인터페이스와 구현체 분리 : 인터페이스와 구현체가 분리되어 런타임 시점에 구현 클래스를 자유롭게 변경 가능
-
낮은 결합도 : 인터페이스와 구현체를 각각 독립적으로 확장 가능하므로 낮은 결합도 유지 가능
-
상세 구현 은닉 : 클라이언트가 인터페이스에만 의존하므로 상세 구현 은닉 가능
7. Adapter vs Bridge
-
Adapter Pattern
-
이미 존재하는 두 인터페이스 간의 불일치 해결
-
인터페이스의 구현 방법 등은 고려하지 않음
-
설계가 완료된 후 호환되지 않은 부분에 적용
-
-
Bridge Pattern
-
정의와 구현을 따로 만들어서 연결
-
새로운 구현의 추가 가능
-
설계가 완료되기 전 추상과 개념을 각각 독립적으로 확장 가능
-
Leave a comment