브릿지 패턴

반응형
반응형

브릿지 패턴..... 이것도 어뎁터와 마찬가지로 떠오르는 이미지가 있을거다.

바로

 

이런 다리 이미지를 떠올릴 것이다. 물론 동물의 다리를 떠올리는 분도 있겠지만 말이다.

근데.. 나는 잘 모르겠다. 왜 이름이 브릿지인지에 대해 전혀 감이 잡히지 않고 있다.

어째든 브릿지 패턴의 가장 큰 특징은 구현과 기능을 분리한다는 점에 있다.

이걸 따로 공부했을때는 아 그렇구나 라고 느꼈는데, 구현과 기능을 합쳐서 내가 아는 구현이 맞는 구현인가라는 착각이 들기도 한다. 결론부터 말하면 내가 생각한 구현이 맞다. 다만, 기능을 분리한다는데 구현에는 뭐가 들어있는 걸까?

구현을 하면 당연히 구현안에도 기능이 있을 텐데....

왜 이걸 구현과 기능의 분리라 한것일까? 사실 분리하는 기능은 기본 기능은 제외된거였다.

예를들면 전자 기기가 있는데 보통 전자기기는 전원을 키고 끄는게 기본이다. 이러한 기능은 애초에 분리하지 않는다. 

분리하는 기능은 전자 계산기는 계산하고, 전자 사전은 찾고, 라디오는 말하고?이런거다.

물론 지금이야 하나의 전자기기가 다른것도 대체하지만...... 여기서는 기본적인 기능만 생각하자.

전자사전이 계산하는 일은 없을거고, 라디오가 계산하는일은 없을 거다. 이런 기능들을 분리한다.

 

그래서 기능하나하나를 추가할때마다 클래스를 추가해줘야하는 불상사가 발생할지도 모른다.

물론 구현체를 추가할때도 마찬가지다. 여기서 구현체를 추가해준다는건 전자 계산기, 전자사전 같은 것들을 말한다. 그러면 상당히 많은 클래스들이 존재한다. 이게 브릿지 패턴의 단점이다. 

 

실무에서는 많이 사용하지 않는다고는 하지만 이것을 배우는 가장 궁극적인 이유는 어댑터 패턴과 유사하기 때문이다. 위글을 읽으면 왜 어댑터와 비슷하지 생각할지도 모른다. 말로만 했을때는 전혀 비슷해보이지는 않지만

코드로 보여준다면 비슷하다고 생각할지도 모른다.

public interface electronicDevice {
    void on();
    void off();
}

이제 이 기능들은 기본 기능들이다. 이제 다른 전자기기도 추가해보자.

public class Radio implements ElectronicDevice {

    @Override
    public void on() {
        System.out.println("전원을 킵니다.");
    }

    @Override
    public void off() {
        System.out.println("전원을 종료합니다.");
    }
}

public class Calculator implements ElectronicDevice {
    @Override
    public void on() {
        System.out.println("전원을 킵니다.");
    }

    @Override
    public void off() {
        System.out.println("전원을 종료합니다.");
    }
}

물론 더 발전해서 interface로 구현하지 않고, class로 구현해서 중복을 제거하는것이 좋을지도 모르겠다.

하지만 이러한 부분은 브릿지 패턴의 핵심이 아니므로 생략하겠다.

보통 기능을 추가하려면 ElectronicDevice와 같은 클래스에 메서드를 추가하는 방법이 있다. 하지만 그렇게 하게 되면,

라디오에는 필요있지만 계산기에는 전혀 필요가 없는 기능이 추가될지도 모른다. 기능을 임의로 지정해서 코딩할 수도 있지만 그렇게 되면 객체 지향 스럽지 않고,, 코드가 쓸데없이 복잡해질수 도 있습니다. 이럴때 사용하는 것이 브릿지 패턴입니다.

 

먼저 추가 기능을 만들어 줍니다.

public class AddFunction {
    private ElectronicDevice electronicDevice;

    public AddFunction(ElectronicDevice electronicDevice) {
        this.electronicDevice = electronicDevice;
        on();
        off();
    }
    
    public void on() {
        electronicDevice.on();
    }
    
    public void off() {
        electronicDevice.off();
    }
}

on,off를 생성자에 굳이 넣어주지 않아도 되지만(이건 브릿지 패턴이 아닙니다.)어차피 이것을 상속받은 곳에서도 그냥 사용하기 위해 만들었습니다. 사람들이 어댑터 패턴과 유사하다고 생각하는 이유가 이 때문입니다. 어댑터 패턴도 인터페이스를 인스턴스화 시키다는 점이 비슷합니다.

 

제가 생각할때 어댑터 패턴은 객체를 바꾸는 패턴이고, 브릿지 패턴은 기능을 추가하는 패턴이라 생각합니다.

구현, 기능을 분리한다는 말보다 기능을 추가한다는 말이 더 와닿는 것 같습니다.

물론 제 이 해석이 틀릴 수도 있겠지만 말입니다. 근데 어디서 부터 말투가 바뀐것 같은데 기분 탓이겠죠?

 

public class Calculate extends AddFunction {

    public Calculate(ElectronicDevice electronicDevice) {
        super(electronicDevice);
    }

    public void action() {
        System.out.println("계산을 합니다.");
    }
}

public class Speak extends AddFunction {
    public Speak(ElectronicDevice electronicDevice) {
        super(electronicDevice);
    }

    public void action() {
        System.out.println("소리가 나옵니다.");
    }
}

자 이제 끝입니다. 이것을 실행하면 됩니다. 하지만 실행 파일은 만들지 않겠습니다. 왜냐하면 귀찮거든요. 또, 실행을 올리는게 목적이 아니라 브릿지 패턴에 대한 이해이기 때문에 일부러 실행파일은 만들지 않을려고요.

하지만 지금 만든 이건 기능을 하나씩밖에 추가하지 못합니다. 예를들어 계산도 할수있고, 사진도 찍을 수 있고, 기타 등등을 전부 할 수 있는 전자기기를 만들 고 싶은데, 그럴때는 어떻게 해야할까요?

실은 저도 모릅니다. 이 점은 저도 연구해서 다시 포스팅 올리겠습니다.

 

뭐 어찌되었든 구현체와 기능을 서로 분리되었습니다. 이것을 어떻게 증명하냐면

계산기능을 라디오에 추가할수도 있고, 계산기능을 라디오에 추가할 수 있기 때문입니다. 물론 반쪽짜리 브릿지 패턴이지만 말입니다..

 

정리하면, 브릿지 패턴은 구현과 기능을 분리하는 패턴이다. 하지만 나는 구현과 기능보다는 기능추가에 더 맞을것 같다는 생각을 하면서 이만 마치겠습니다. 감사합니다. 

반응형

'디자인패턴' 카테고리의 다른 글

데코레이터 패턴  (0) 2020.05.02
컴포지트 패턴  (0) 2020.05.01
옵저버 패턴  (0) 2020.04.28
퍼사드 패턴  (0) 2020.04.23
어댑터 패턴  (0) 2020.04.21

댓글

Designed by JB FACTORY