Read Book/헤드퍼스트 디자인 패턴
12장. 복합 패턴
nowwater
2023. 7. 2. 12:05
728x90
복합 패턴
반복적으로 생길 수 있는 일반적이 문제를 해결하는 용도로 2개 이상의 패턴을 결합해서 사용하는 것
단순히 여러 패턴을 섞어 쓴다고 해서 복합 패턴인 것은 아님
예시 1: 오리 만들기
오리 예시에 거위 추가 + 꽥꽥 소리 횟수 측정 + 오리 무리 단위로 관리 + 꽥꽥 소리 나면 연락받기
- 각 오리 객체(Quackable + QuackObservable) 별로 자신의 행위를 관찰할 Observer 를 저장할 수 있는 Observable( + QuackObservable) 을 저장하고 있음
- 이후 QuackObservable 의 메서드인 RegisterObserver 로 관찰자를 Observer 에 등록하고, 특정 행위를 수행할 때 NotifyObservers 를 호출하여 등록된 관찰자들 모두에게 알려준다
- 이때 각 관찰자 별로 어떤 알림을 줄지는 관찰자가 구현하는 Update 메서드에 따라 달라진다.
예시 2: 모델-뷰-컨트롤러 (MVC)
모델
- 모든 데이터, 상태, 애플리케이션 로직(데이터를 관리하고 조작하는 코드)을 포함
- 뷰와 컨트롤러에서 모델의 상태를 조작하거나 가져올 때 필요한 인터페이스 제공
- 자신의 상태 변화를 옵저버들에게 연락해 주긴 하지만, 기본적으로 뷰와 컨트롤러에 별 관심이 없음
뷰
- 모델을 표현하는 방법을 제공
- 모델의 상태가 변경되면 변경 사실을 전달받고, 화면 표시에 필요한 상태와 데이터는 모델에서 직접 가져옴
- 사용자는 뷰에만 접촉 가능
컨트롤러
- 사용자로부터 입력을 받고, 입력받은 내용이 모델에게 어떤 의미가 있는지 파악
- 입력받은 내용의 의미를 해석한 후 모델에게 상태를 변경하라고 요청
이렇게 뷰와 컨트롤러를 분리하면 2가지 이점이 존재한다
- 화면을 표시하는 역할과 사용자 입력 내용을 해석하고 모델을 조작하는 역할을 분리할 수 있다. → 컨트롤러를 통해 제어 로직을 뷰로부터 분리해서 뷰와 모델의 결합을 끊어주고, 뷰와 컨트롤러를 느슨하게 결합하여 컨트롤러를 재사용할 수도 있다.
- 뷰를 모델과 분리할 수 있다. → 뷰를 다른 모델과 연결해서 재사용할 수 있음
MVC 에는 여러 가지 패턴이 적용되어 있다.
전략 패턴: 뷰와 컨트롤러의 관계
- 뷰 객체를 여러 전략을 써서 설정 가능하며, 컨트롤러가 사용자의 행동에 따라 전략을 제공한다.
- 즉, 뷰는 겉모습에만 신경을 쓰고, 인터페이스의 행동을 결정하는 일은 모두 컨트롤러에게 맡긴다.
→ 뷰를 모델로부터 분리하는 것을 도와줌
옵저버 패턴: 컨트롤러와 모델의 관계
- 모델의 상태가 변경되었을 때 그 모델과 연관된 객체들에게 연락
- 모델을 뷰와 컨트롤러로부터 완전히 독립시킬 수 있고, 한 모델에서 서로 다른 뷰를 사용할 수 있다.
- 새로운 모델을 기존의 뷰와 컨트롤러에 연결해서 쓸 때는 어댑터 패턴을 활용하면 된다.
컴포지트 패턴: 뷰
뷰는 기본적으로 컴포지트 패턴을 사용한다. → 최상위 구성요소에 다른 구성요소들이 들어 있는 형태
최근에는 스윙같은 GUI 패키지가 복잡해져서 내부 구조를 한 눈에 알아보기 힘들다보니 컴포지트 패턴이 쓰인다는 사실을 알기 힘듦