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 라이선스를 따릅니다.
댓글
아직 댓글이 없습니다