포스트

2023-02-22-TIL

2023-02-22-TIL

Today I Learned

  • 서비스 레파지토리 구조와도 유사
  • 함수형에서의 계층형도 유사
  • device 고유 기능을 조합해서 remote를 구성
  • 어떤것이 변하고 변하지않는지

이날은 메모만 남겼다. 무엇에 대한 메모인지는 적혀 있지 않지만, device의 기능을 조합해 remote를 구성한다는 예시는 브리지(Bridge) 패턴을 설명할 때 쓰는 대표 예제와 같다. 그래서 브리지 패턴을 기준으로 메모를 풀어 둔다.


브리지 패턴

브리지는 큰 클래스나 밀접하게 관련된 클래스 묶음을 추상화(abstraction)와 구현(implementation)이라는 두 계층으로 나누는 구조 패턴이다(Refactoring.Guru: Bridge). 상속으로 모든 조합을 만들면 RedCircle, BlueCircle, RedSquare처럼 조합 수만큼 클래스가 늘어난다. 브리지는 한 축을 별도 계층으로 빼내고, 원래 클래스가 그 계층의 객체를 참조(합성)하게 만든다.

리모컨 예제에서 RemoteControl이 추상화, Device가 구현 인터페이스다. 리모컨은 TV인지 라디오인지 모른 채 Device가 제공하는 고유 기능(전원, 볼륨, 채널)을 조합해 “음소거” 같은 상위 동작을 만든다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
interface Device {
    boolean isEnabled();
    void enable();
    void disable();
    int getVolume();
    void setVolume(int percent);
}

class RemoteControl {
    protected final Device device;

    RemoteControl(Device device) { this.device = device; }

    void togglePower() {
        if (device.isEnabled()) device.disable(); else device.enable();
    }
}

class AdvancedRemoteControl extends RemoteControl {
    AdvancedRemoteControl(Device device) { super(device); }

    void mute() { device.setVolume(0); }
}

새 리모컨을 추가해도 Tv, Radio 코드는 바뀌지 않고, 새 기기를 추가해도 리모컨 코드는 바뀌지 않는다. 두 계층이 각자 독립적으로 확장된다.


메모를 다시 읽으면

  • 서비스와 리포지토리 구조와 유사하다: 서비스가 리포지토리 인터페이스를 참조하고 구체 구현(JPA, MyBatis 등)은 따로 두는 구조는, 상위 로직이 하위 구현을 합성으로 쓰는 브리지의 형태와 닮았다.
  • 함수형의 계층형 설계와도 유사하다: 아래 계층이 작은 기본 동작을 제공하고 위 계층이 그것을 조합해 더 큰 동작을 만든다는 점에서 같은 생각이다.
  • 무엇이 변하고 무엇이 변하지 않는지: 패턴을 고르는 기준이다. 리모컨 종류와 기기 종류처럼 서로 다른 이유로 변하는 두 축을 찾으면, 그 경계에서 계층을 나누면 된다.
참고한 자료외부 출처 1

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다