[Design Pattern] Observer Pattern
programming/design-pattern

[Design Pattern] Observer Pattern


2. Observer Pattern


 옵저버 패턴 또는 번역해서 관찰자 패턴이라고 불리는 이 패턴하면 스타크래프트에 있는 프로토스 유닛이 떠오릅니다. 이 유닛은 상대의 상태를 확인하여 해당 소식을 알려줍니다. 예를 들어, 상대방이 공격 시동을 걸고 있다면 그에 대한 소식을 듣고 대비를 할 수 있겠죠? 이와 마찬가지로 옵저버 패턴이란 어떤 객체의 상태가 바뀌거나 중요한 메서드가 호출되었을 때 이와 관련된 객체들에게 소식을 전달할 수 있는 패턴입니다.



2.1 옵저버 패턴의 정의


 2.1.1 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락을 하고 연락받은 객체에서는 자동으로 내용이 갱신되도록 하는 방식입니다.


 2.1.2 상태가 바뀌는 객체를 주제(Subject)라고 하고, 그 주제의 상태에 의존하는 객체를 옵저버(Observer)라고 하며, 주제와 Observer가 일대다(One-to-Many)의 의존성을 가집니다.


 2.1.3 일대일로 연락을 전할 뿐 아니라, 연락을 전달하는 입장에서는 일대다 관계, 연락을 받는 입장에서는 다대일 관계, 즉 다대다 관계로 연락을 전달할 수 있습니다.



2.2 옵저버 패턴의 목적


연락을 주고받는 관계에서 의존성을 줄이는데 목적을 둡니다.

디자인 패턴의 다음의 원칙과 밀접한 관계를 가진 패턴입니다.


느슨한 결합(Loose Coupling)


서로 상호작용을 하는 객체 사이에서는 가능한 느슨하게 결합하는 디자인을 사용한다.


두 객체가 느슨하게 결합되어있다는 의미는 서로 메시지를 주고 받긴 하지만 익명 채팅처럼 서로에 대해서는 잘 모르는 것을 의미합니다.



2.3 옵저버 패턴의 효과


 옵저버 패턴을 통해 디자인 설계 시 느슨한 결합의 효과를 얻을 수 있습니다. 그 이유는 다음과 같습니다.


 2.3.1 주제(Subject)의 입장에서 옵저버(Observer)라는 객체들에 대해 알고있는 것은 특정 인터페이스를 구현한다는 것 뿐입니다.

  - 연락을 받거나 상태를 가져갈 수 있는 Observer라는 인터페이스를 구현한 구상 클래스


 2.3.2 옵저버(Observer)는 언제든지 새로 추가할 수 있습니다.

  - 주제(Subject)는 Observer라는 인터페이스를 구현한 객체라면 그 객체가 어느 종류의 클래스인지는 상관없이 옵저버로 등록할 수 있음

  - 구체적인 구상클래스에 의존하지 않기 때문에 실행 중에 옵저버 객체를 제거하거나 다른 클래스의 인스턴스로 변경할 수 있음


 2.3.3 새로운 형식(규격)을 갖는 옵저버를 추가하려고 해도 주제를 전혀 변경할 필요가 없습니다.

  - 옵저버 클래스가 Observer의 인터페이스를 어떤 형식으로든 구현만 하면 다른 규격을 갖는 클래스나 인터페이스를 구현해도 주제 입장에서는 전혀 상관이 없음(ex. class ConcreteObserver implements Observer, Comparable)


 2.3.4 주제와 옵저버는 서로 독립적으로 재사용할 수 있습니다.

  - 주제와 옵저버는 서로에 대해 아는 것은 특정 인터페이스(Subject, Observer)를 구현한 객체라는 것 뿐

  - 이렇게 느슨한 결합을 갖고있기 때문에 주제나 옵저버를 전혀 다른 용도로 재사용 가능

   ex. Observer를 인스턴스 변수로 구성하고 기능을 확장하거나 변경 가능


 2.3.5 주제나 옵저버가 바뀌더라도 서로한테 영향을 미치지는 않습니다.

  - 앞서 언급한 이유(느슨한 결합)들과 일맥상통


 결론적으로 느슨한 결합을 사용하면 어떤 변경 사항이 생겨도 의존성이 최소화되어있기 때문에 무난히 처리할 수 있는 유연한 시스템을 구축할 수 있습니다.


2.4 푸시 방식과 풀 방식 (Push and Pull Model)





참고할 만한 좋은 사이트


- http://doohyun.tistory.com/81 ★


- http://plposer.tistory.com/17?category=599723


- https://www.reimaginer.me/entry/Observer-%ED%8C%A8%ED%84%B4%EA%B3%BC-%EC%8B%A4%EC%A0%9C-%EC%98%88%EC%A0%9C


- http://friday.fun25.co.kr/blog/?p=157


- http://jusungpark.tistory.com/8


- https://flowarc.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%98%B5%EC%A0%80%EB%B2%84-%ED%8C%A8%ED%84%B4Observer-Pattern


http://includestdio.tistory.com/39