You will be fine

<디자인패턴입문> 5. Bridge 패턴

by BFine
반응형

www.yes24.com/Product/Goods/2918928

 

Java 언어로 배우는 디자인 패턴 입문

이 책은 디자인 패턴의 입문서입니다. GoF가 정리한 23개의 디자인 패턴을 하나씩 다루면서 객체 지향을 잘 모르는 초보자도 이해하기 쉽도록 정리하고 있습니다. 단순한 이론이나 논리을 제시하

www.yes24.com

 

가. 무엇인가

 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에서만 교체하면 된다.

브릿지 패턴은 기능계층과 구현계층을 분리하는 구조패턴이다.
반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기