옵저버 패턴

문딤·2022년 7월 13일
0

1. 느슨한 결합

두 객체가 느슨하게 결합되어 있다는 것, 그 둘이 상호작용을 하긴 하지만, 서로에 대해서 잘 모른다.(상호작용하는 객체)

🔴 인터페이스를 통해 의존하는 객체에 대한 구체적인 정보없이 맺어진 추상적인 관계를 의미한다.
🔴 의존하는 객체에 변경이 일어나도 인터페이스 규약이 지켜지는 한 이를 사용하는 쪽에서는 어떠한 수정작업도 일어나지 않는다.
🔴 코드의 재사용성이 증가, 변화에 대응하는 유연성을 갖게 된다.

2. 옵저버 패턴의 구조

옵저버 패턴이란?

어떤 객체가 자기 상태값을 바꿀 때 다른 객체들에게 그 사실을 알리는 것.
주체와 옵저버는 일대다 관계라서 한 주체가 여러 옵저버를 거느릴 수 있다.

ex) 신문 구독
주체의 변화를 구독하는 객체가 자신을 주체에 심어두고 새 소식이 담긴 신문을 받아본다.
뭔가 바뀌었을때만 옵저버 객체를 깨우는 것.

옵저버 또는 리스너(listener)라 불리는 하나 이상의 객체를 관찰 대상이 되는 객체에 등록시킨다. 
그리고 각각의 옵저버들은 관찰 대상인 객체가 발생시키는 이벤트를 받아 처리한다.

✅Observer
데이터의 변경을 통보 받는 인터페이스
즉, Subject에서는 Observer 인터페이스의 update 메서드를 호출함으로써 ConcreteSubject의 데이터 변경을 ConcreteObserver에게 통보한다.

✅Subject
ConcreteObserver 객체를 관리하는 요소
Observer 인터페이스를 참조해서 ConcreteObserver를 관리하므로 ConcreteObserver의 변화에 독립적일 수 있다.

✅ConcreteSubject
변경 관리 대상이 되는 데이터가 있는 클래스(통보하는 클래스)
데이터 변경을 위한 메서드인 setState가 있다.
setState 메서드에서는 자신의 데이터인 subjectState를 변경하고 Subject의 notifyObservers 메서드를 호출해서 ConcreteObserver 객체에 변경을 통보한다.

✅ConcreteObserver
ConcreteSubject의 변경을 통보받는 클래스
Observer 인터페이스의 update 메서드를 구현함으로써 변경을 통보받는다.
변경된 데이터는 ConcreteSubject의 getState 메서드를 호출함으로써 변경을 조회한다.

3. 옵저버 패턴의 예시.

💨Java Swing 라이브러리는 이벤트 관리를 위해 옵서버 패턴을 광범위하게 사용했다.
💨Boost.Signals, 시그널/슬롯(signal/slot) 모델을 제공하기 위해 C++ STL을 확장했다.
💨C++ 프레임워크의 시그널/슬롯 모델인 QT
💨libsigc++, C++ 시그널링 템플릿 라이브러리
💨GLib, C로 객체와 시그널/콜백을 구현. 이 라이브러리는 다른 프로그래밍 언어에서 쓰기 위해 많은 바인딩 방법을 갖고 있다)
💨옵저버 디자인 패턴 탐험, C#과 비주얼 베이직 닷넷으로 대표 기법과 이벤트 패턴(the Event pattern)을 사용했다.

4. 옵저버 패턴의 장단점.

⭕ 장점

변경 사항이 생겨도 무난히 처리할 수 있는 유연한 객체지향 시스템을 구축할 수 있다. 이는 객체 사이의 상호의존성을 최소화할 수 있기 때문이다. (느슨하게 결합되어 있기 때문이다 )
Open / Close 원칙(개방 폐쇄 원칙 OCP)을 지킬 수 있다. (개방 폐쇄 원칙: 확장에는 열려있고, 변경에는 닫혀있어야 한다. )

❌ 단점

Observer에게 알림이 가는 순서를 보장할 수 없다.
Observer, Subject의 관계가 잘 정의되지 않으면 원하지 않는 동작이 발생할 수 있다.

참고

java EE 디자인패턴

profile
풀스택개발자가 될래요

0개의 댓글