1. 옵저버의 정의
2. 옵저버 패턴의 사용 이유
3. 델리게이트 옵저버 패턴
4. 옵저버 패턴 직접 구현
5. Pull 방식 옵저버 패턴
옵저버(Observer) : 상태 변화를 감지하고 이에 따라 반응하는 객체
쉽게 말해 특정 이벤트나 상태 변화를 자동으로 통보받아 반응하는 대상옵저버 패턴은 구독자 인터페이스를 구현하는 모든 객체에 대한 이러한 이벤트들을 구독 및 구독 취소하는 방법을 제공한다.

강한 결합(Tight Coupling)
ObserverTest() 클래스는 obs1, obs2를 직접 참조한다.
따라서 새로운 옵저버가 추가되거나 제거 되면 원본 클래스(ObserverTest())를
수정해야 한다.


델리게이트는 느슨한 결합(Loose Coupling) 구조가 된다.
Subject는 Action 델리게이트를 통해 구체적으로 어떤 옵저버들에 연결되어 있는지 몰라도 된다.
델리게이트가 연결된 메서드를 호출할 뿐이므로, Subject는 옵저버 클래스와 독립적이다.
또한 옵저버를 동적으로 추가 및 제거하기 쉽다.
추가하고 싶다면 action에+=하기만 하면 되고, 제거하고 싶다면-=하면 된다.
서브젝트(Subject) : 상태 변화를 관리하고 옵저버들에게 알리는 대상


직접 구현한 옵저버 패턴도 느슨한 결합(Loose Coupling)이 된다.
서브젝트(Subject)는 구체적으로 어떤 옵저버들에 연결되어 있는지 몰라도 된다.
연결도 옵저버를 호출할 뿐이다.
Push 방식
위에서 구현한 옵저버 패턴들은 Push 방식이다.
모든 옵저버에게 Push 방식으로 서브젝트의 상태나 데이터를 전달한다.
이런 방식은 옵저버가 필요하지 않은 정보까지 전달할 수 있다.
Pull 방식
옵저버가 필요한 시점에 서브젝트의 상태나 데이터를 요청할 수 있어서
유연성이 증가한다.

ISubject 코드에 옵저버가 뭔가 요청했을때 반환해줄
GetState메서드가 추가되었다.

위의 ISubject 추상 클래스에서
GetState가 추가되면서 Subject를 구현할 클래스에서
GetState메서드와 상태를 변경할ChangeState메서드를 추가하였다.