<디자인패턴입문> 5. Bridge 패턴
by BFinewww.yes24.com/Product/Goods/2918928
가. 무엇인가
a. 기능과 구현의 분리
- Bridge는 다리를 뜻하며 연결해주는 의미가 있듯이 기능클래스 계층과 구현클래스 계층을 연결한다는 의미이다.
- 기능클래스 계층과 구현클래스 계층을 두개의 독립된 클래스 계층으로 분리하고 다리로 연결하는 패턴이다.
b. 기능클래스 계층
- 어떤 클래스에 기능을 추가하고 싶은 경우 상속을 이용하여 기능을 추가한다.
- 즉 상위 클래스는 기본적인 기능을 가지고 하위클래스에서 새로운 기능을 추가한다.
- 또 새로운 기능을 추가할 경우 하위클래스의 하위클래스를 만들어서 추가한다.
=> 일반적으로 클래스 계층은 너무 깊게하지 않는 편이 좋다.
c. 구현클래스 계층
- 상위 클래스를 추상클래스로 정의하고 실제 구현은 하위클래스가 담당한다.
- 기능클래스와 달리 새로운 구현 추가는 수평적으로 이뤄진다.
나. 만들어본 예제
a. Abstaction(추상화) 역할
- 기능클래스의 최상위 클래스, 기본적인 기능만 기술되어 있다.
- Implementor 역할의 인스턴스를 위임하여 사용해 구현클래스와 연결한다.
public class HairCut {
private HairCutImpl hairCutImpl;
public HairCut(HairCutImpl hairCutImpl) {
this.hairCutImpl = hairCutImpl;
}
protected void check(){
hairCutImpl.check();
}
protected void cut(){
hairCutImpl.cut();
}
protected void paid(){
hairCutImpl.paid();
}
public final void service(){
check();
cut();
paid();
}
}
b. RefinedAbstaction (개선된 추상화) 역할
- Abstaction역할에 대해 기능을 추가한 역할이다.
public class PermAndHairCut extends HairCut{
public PermAndHairCut(HairCutImpl hairCutImpl) {
super(hairCutImpl);
}
public void permService(){
check();
perm();
paid();
System.out.println();
}
private void perm(){
System.out.println("--- 펌 하는중입니다 ---");
}
}
c. Implementor(구현자) 역할
- 구현클래스 계층의 최상위 클래스, Abstaction역할의 인터페이스(API)를 구현하기 위한 메서드를 규정하는 역할
public abstract class HairCutImpl {
public abstract void check();
public abstract void cut();
public abstract void paid();
}
d. Concreate Implementor(구체적인 구현자) 역할
- Implementor의 인터페이스(API)를 구체적으로 구현하는 역할이다.
public class HongDaeHairCutImpl extends HairCutImpl{
@Override
public void check() {
System.out.println("--- 홍대점 예약을 확인합니다 ---");
}
@Override
public void cut() {
System.out.println("--- 머리를 자르는중입니다---");
}
@Override
public void paid() {
System.out.println("--- 비용을 계산합니다 ---");
}
}
public class GangNamHairCutImpl extends HairCutImpl{
@Override
public void check() {
System.out.println("--- 강남점 예약을 확인합니다 ---");
}
@Override
public void cut() {
System.out.println("--- 머리를 자르는중입니다---");
}
@Override
public void paid() {
System.out.println("--- 비용을 계산합니다 ---");
}
}
e. Main
public static void main(String[] args) {
HairCut hairCut1 = new HairCut(new HongDaeHairCutImpl());
HairCut hairCut2 = new HairCut(new GangNamHairCutImpl());
hairCut1.service();
hairCut2.service();
// 기능 추가
PermAndHairCut perm = new PermAndHairCut(new GangNamHairCutImpl());
perm.permService();
}
// 실행
--- 홍대점 예약을 확인합니다 ---
--- 머리를 자르는중입니다---
--- 비용을 계산합니다 ---
--- 강남점 예약을 확인합니다 ---
--- 머리를 자르는중입니다---
--- 비용을 계산합니다 ---
--- 강남점 예약을 확인합니다 ---
--- 펌 하는중입니다 ---
--- 비용을 계산합니다 ---
다. 정리
a. 분리하면 확장이 편해진다.
- 기능을 추가하고 싶으면 기능클래스계층에 클래스를 추가하면 된다.
=> 이때 구현클래스의 계층은 전혀 수정할 필요가 없다.
b. 상속은 견고, 위임은 느슨
- 상속관계는 소스 코드를 고쳐 쓰지 않는 한 바꿀 수 없는 견고한 연결이 된다.
- 위임은 단순 떠넘기기를 하고 있으며 구현체를 변경하는 경우 단순히 Main에서만 교체하면 된다.
브릿지 패턴은 기능계층과 구현계층을 분리하는 구조패턴이다.
'개발서적 > 디자인패턴입문' 카테고리의 다른 글
<디자인패턴입문> 7. Strategy 패턴 (0) | 2021.04.30 |
---|---|
<디자인패턴입문> 6. Abstract Factory 패턴 (0) | 2021.04.26 |
<디자인패턴입문> 4. Prototype 패턴 (0) | 2021.04.24 |
<디자인패턴입문> 3. Template Method 패턴 (0) | 2021.04.22 |
<디자인패턴입문> 2. Adapter 패턴 (0) | 2021.04.21 |
블로그의 정보
57개월 BackEnd
BFine