아무거나

[Design Pattern] Bridge Pattern 본문

Java/Java

[Design Pattern] Bridge Pattern

전봉근 2019. 12. 12. 01:02
반응형

브릿지 패턴(Bridge Pattern)

구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 해주는 패턴이다. 즉, 기능 부분과 구현 부분을 분리

 

먼저 브릿지 패턴을 사용하지 않고 모스부호를 출력하는 기능을 구현해보자.

[MorseCode.java]

package com.bkjeon.bridge;

public class MorseCode {

    public void dot() {
        System.out.print(".");
    }

    public void dash() {
        System.out.print("-");
    }

    public void space() {
        System.out.print(" ");
    }

}

[PrintMorseCode.java]

package com.bkjeon.bridge;

public class PrintMorseCode extends MorseCode {

    public PrintMorseCode b() {
        dash();dash();dot();space();
        return this;
    }

    public PrintMorseCode o() {
        dot();dash();space();
        return this;
    }

    public PrintMorseCode n() {
        dot();dash();dot();space();
        return this;
    }

    public PrintMorseCode g() {
        dash();dash();space();
        return this;
    }

}

[Main.java]

package com.bkjeon.bridge;

public class Main {

    public static void main(String[] args) {
        PrintMorseCode code = new PrintMorseCode();

        // 체이닝 적용
        code.b().o().n().g();
    }

}

실행결과

--. .- .-. --

여기서 만약 MorseCode의 내용을 소리로 바꾼다고하면 해당 클래스를 수정하거나 새로운 클래스를 추가하여야 한다. 또한 PrintMorseCode도 필요하기 때문에 매우 불편하다 이러한 것들을 기능과 구현을 분리시켜보자.

그렇다면 MorseCode의 메소드 부분을 다른곳에서 구현하면 간편해진다. 먼저 모스부호 관련 인터페이스를 작성하자.

[MorseCodeFunction.java]

package com.bkjeon.bridge;

public interface MorseCodeFunction {

    public void dot();
    public void dash();
    public void space();

}

그 다음 MorseCode 에서 MorseCodeFunction를 Delegate한다.(=위임)
[MorseCode.java]

package com.bkjeon.bridge;

public class MorseCode {

    private MorseCodeFunction function;

    public MorseCode(MorseCodeFunction function) {
        this.function = function;
    }

    public void setFunction(MorseCodeFunction function) {
        this.function = function;
    }

    public void dot() {
        function.dot();
    }

    public void dash() {
        function.dash();
    }

    public void space() {
        function.space();
    }

}

PrintMorseCode에 MorseCodeFuntion을 인자로하는 생성자를 만든다.
[PrintMorseCode.java]

package com.bkjeon.bridge;

public class PrintMorseCode extends MorseCode {

    // 추가
    public PrintMorseCode(MorseCodeFunction function) {
        super(function);
    }

    public PrintMorseCode b() {
        dash();dash();dot();space();
        return this;
    }

    public PrintMorseCode o() {
        dot();dash();space();
        return this;
    }

    public PrintMorseCode n() {
        dot();dash();dot();space();
        return this;
    }

    public PrintMorseCode g() {
        dash();dash();space();
        return this;
    }

}

Main에서 PrintMorseCode에 넘겨줘서 사용해야할 인터페이스를 만들자.
[DefaultMCF.java]

package com.bkjeon.bridge;

public class DefaultMCF implements MorseCodeFunction {

    @Override
    public void dot() {
        System.out.print(".");
    }

    @Override
    public void dash() {
        System.out.print("-");
    }

    @Override
    public void space() {
        System.out.print(" ");
    }

}

메인 함수에 적용해보자.
[Main.java]

package com.bkjeon.bridge;

public class Main {

    public static void main(String[] args) {
        PrintMorseCode code = new PrintMorseCode(new DefaultMCF());

        // 체이닝 적용
        code.b().o().n().g();
    }

}

실행결과

--. .- .-. --

여기서 만약 소리로 구현해보고 싶다고 하자.

먼저 SoundMCF 클래스를 생성하자.
[SoundMCF.java]

package com.bkjeon.bridge;

public class SoundMCF implements MorseCodeFunction {
    @Override
    public void dot() {
        System.out.print("삣");
    }

    @Override
    public void dash() {
        System.out.print("삐~");
    }

    @Override
    public void space() {
        System.out.print("음");
    }
}

그 다음 메인에 PrintMorseCode에 넘겨줄 인터페이스를 SoundMCF로 변경하자.
[SoundMCF.java]

package com.bkjeon.bridge;

public class Main {

    public static void main(String[] args) {
        PrintMorseCode code = new PrintMorseCode(new SoundMCF());

        // 체이닝 적용
        code.b().o().n().g();
    }

}

실행결과

삐~삐~삣음삣삐~음삣삐~삣음삐~삐~음

같은 방법으로 플래시로 구현해보자.

[FlashMCF.java]

package com.bkjeon.bridge;

public class FlashMCF implements MorseCodeFunction {
    @Override
    public void dot() {
        System.out.print(" 번쩍 ");
    }

    @Override
    public void dash() {
        System.out.print(" 반짝 ");
    }

    @Override
    public void space() {
        System.out.print(" - ");
    }
}

메인도 FlashMCF로 변경해준다.
[Main.java]

package com.bkjeon.bridge;

public class Main {

    public static void main(String[] args) {
        PrintMorseCode code = new PrintMorseCode(new FlashMCF());

        // 체이닝 적용
        code.b().o().n().g();
    }

}

실행결과

반짝  반짝  번쩍  -  번쩍  반짝  -  번쩍  반짝  번쩍  -  반짝  반짝  -

이렇게해서 기능과 구현을 분리하면 다양한 하드웨어나 컴퓨터 자원을 사용할 수 있다. 즉 Main 클래스에서 PrintMorseCode의 선언된 부분만 변경해주면 된다.

 

참고: https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard

반응형

'Java > Java' 카테고리의 다른 글

<![CDATA[ ]]> 사용 이유  (0) 2019.12.24
[Design Pattern] Composite Pattern  (0) 2019.12.21
[Design Pattern] Abstract Factory Pattern  (0) 2019.12.10
[Design Pattern] Builder Pattern  (0) 2019.12.08
[Design Pattern] Prototype Pattern  (0) 2019.12.08
Comments