nowwater 2023. 7. 2. 12:05
728x90

복합 패턴

반복적으로 생길 수 있는 일반적이 문제를 해결하는 용도로 2개 이상의 패턴을 결합해서 사용하는 것

단순히 여러 패턴을 섞어 쓴다고 해서 복합 패턴인 것은 아님

 

예시 1: 오리 만들기

오리 예시에 거위 추가 + 꽥꽥 소리 횟수 측정 + 오리 무리 단위로 관리 + 꽥꽥 소리 나면 연락받기

  • 각 오리 객체(Quackable + QuackObservable) 별로 자신의 행위를 관찰할 Observer 를 저장할 수 있는 Observable( + QuackObservable) 을 저장하고 있음
  • 이후 QuackObservable 의 메서드인 RegisterObserver 로 관찰자를 Observer 에 등록하고, 특정 행위를 수행할 때 NotifyObservers 를 호출하여 등록된 관찰자들 모두에게 알려준다
  • 이때 각 관찰자 별로 어떤 알림을 줄지는 관찰자가 구현하는 Update 메서드에 따라 달라진다.

예시 2: 모델-뷰-컨트롤러 (MVC)

모델

  • 모든 데이터, 상태, 애플리케이션 로직(데이터를 관리하고 조작하는 코드)을 포함
  • 뷰와 컨트롤러에서 모델의 상태를 조작하거나 가져올 때 필요한 인터페이스 제공
  • 자신의 상태 변화를 옵저버들에게 연락해 주긴 하지만, 기본적으로 뷰와 컨트롤러에 별 관심이 없음

  • 모델을 표현하는 방법을 제공
  • 모델의 상태가 변경되면 변경 사실을 전달받고, 화면 표시에 필요한 상태와 데이터는 모델에서 직접 가져옴
  • 사용자는 뷰에만 접촉 가능

컨트롤러

  • 사용자로부터 입력을 받고, 입력받은 내용이 모델에게 어떤 의미가 있는지 파악
  • 입력받은 내용의 의미를 해석한 후 모델에게 상태를 변경하라고 요청

이렇게 뷰와 컨트롤러를 분리하면 2가지 이점이 존재한다

  1. 화면을 표시하는 역할과 사용자 입력 내용을 해석하고 모델을 조작하는 역할을 분리할 수 있다. → 컨트롤러를 통해 제어 로직을 뷰로부터 분리해서 뷰와 모델의 결합을 끊어주고, 뷰와 컨트롤러를 느슨하게 결합하여 컨트롤러를 재사용할 수도 있다.
  2. 뷰를 모델과 분리할 수 있다. → 뷰를 다른 모델과 연결해서 재사용할 수 있음

 

MVC 에는 여러 가지 패턴이 적용되어 있다.

전략 패턴: 뷰와 컨트롤러의 관계

  • 뷰 객체를 여러 전략을 써서 설정 가능하며, 컨트롤러가 사용자의 행동에 따라 전략을 제공한다.
  • 즉, 뷰는 겉모습에만 신경을 쓰고, 인터페이스의 행동을 결정하는 일은 모두 컨트롤러에게 맡긴다.

→ 뷰를 모델로부터 분리하는 것을 도와줌

 

옵저버 패턴: 컨트롤러와 모델의 관계

  • 모델의 상태가 변경되었을 때 그 모델과 연관된 객체들에게 연락
  • 모델을 뷰와 컨트롤러로부터 완전히 독립시킬 수 있고, 한 모델에서 서로 다른 뷰를 사용할 수 있다.
  • 새로운 모델을 기존의 뷰와 컨트롤러에 연결해서 쓸 때는 어댑터 패턴을 활용하면 된다.

 

컴포지트 패턴: 뷰

뷰는 기본적으로 컴포지트 패턴을 사용한다. → 최상위 구성요소에 다른 구성요소들이 들어 있는 형태

최근에는 스윙같은 GUI 패키지가 복잡해져서 내부 구조를 한 눈에 알아보기 힘들다보니 컴포지트 패턴이 쓰인다는 사실을 알기 힘듦