[헤드 퍼스트 디자인 패턴] chapter 2. 옵저버 패턴(Observer Pattern)

이다은·2023년 10월 27일
0

독서

목록 보기
7/8
post-thumbnail

시작하며

이 글은 헤드퍼스트 디자인 패턴 을 읽으며 정리한 글이다. 내가 정리해두고 내가 다시 보기 위해 쓰는 중이다! 내정내보
"유지보수에 대한 고민을 하는 개발자"로서, 유지보수 가능한 코드 작성은 프로젝트의 장기적인 성공을 위해 필수적이라고 생각한다. 그렇기에 변경에 용이한 코드를 작성하는 것은 매우 중요하다 !!!!💡 헤드퍼스트 디자인패턴 에서는 유지보수에 용이한 코드를 작성하기 위한 패턴을 제안하고, 예제 코드에 패턴을 적용해서 개선되는 모습을 보여준다.

옵저버 패턴

옵저버 패턴(Observer Pattern) 은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로, 일대다(one-to-many) 의존성을 정의한다.


위 사진처럼 주제와 옵저버들 사이에 일대다 관계가 정의된다. 옵저버는 주제에 연관되어 있으며, 주제의 상태가 바뀌면 옵저버에게 정보가 전달된다.
위 예시에서는 주제가 변경되면 연관된 옵저버인 foo, bar, qux, baz 객체에게 정보가 전달될 것이다.

느슨한 결합(Loose Coupling)

느슨한 결합(Loose Coupling) 은 객체들이 상호작용할 수는 있지만, 서로를 잘 모르는 관계를 의미한다. 앞으로 읽을 내용에 나오겠지만, 느슨한 결합을 활용하면 유연성이 아주 좋아진다. 옵저버 패턴은 느슨한 결합을 보여주는 훌륭한 예이다.

  • 주제는 옵저버가 특정 인터페이스(Observer Interface)를 구현한다는 사실만 알고 있다.
  • 옵저버는 언제든지 새로 추가할 수 있다. 새로운 형식의 옵저버를 추가할 때도 주제를 변경할 필요가 전혀 없다.
  • 주제와 옵저버는 서로 독립적으로 재사용 할 수 있다. 주제나 옵저버가 달라져도 서로에게 영향을 미치지 않는다.

디자인 원칙

  • 상호작용하는 객체 사이에는 가능하면 느슨한 결합을 사용해야 한다.
    • 느슨하게 결합하는 디자인을 사용하면 변경 사항이 생겨도 무난히 처리할 수 있는 유연한 객체지향 시스템을 구축할 수 있다. 객체 사이의 상호의존성을 최소화할 수 있기 때문이다

옵저버 데이터 방식의 푸시(push) vs 풀(pull)

  • 푸시(push): 주제가 옵저버로 데이터를 보냄
  • 풀(pull): 옵저버가 주제로부터 데이터를 당겨옴

✅ 결론

  • 옵저버 패턴은 객체들 사이에 일대다 관계를 정의한다.
  • 주제는 동일한 인터페이스를 써서 옵저버에게 연락을 한다. ex) update()
  • Observer 인터페이스를 구현하기만 하면 어떤 구상 클래스의 옵저버라도 패턴에 참여할 수 있다.
  • 주제는 옵저버들이 Observer 인터페이스를 구현한다는 것을 제외하면 옵저버에 관해 전혀 모른다. 따라서 이들 사이의 결합은 느슨한 결합이다.
  • 옵저버 패턴을 사용하면 주제가 데이터를 보내거나(push) 옵저버가 데이터를 가져올(pull) 수 있다.
  • 느슨한 결합(Loose Coupling)은 코드의 변경을 유연하게 만든다.

마치며

옵저버패턴을 사용하면 주제를 바꾸지 않고도 주제의 상태에 의존하는 객체들을 바꿀 수 있다. 코드 중 일부분의 변경이 다른 부분까지의 변경을 불러일으킬 때가 있는데, 옵저버 패턴을 적용하여 느슨한 결합을 사용하면 의도치 않은 변경을 막고, 유연한 변경을 하기에 적합하다. 그렇기 때문에 나중에 유지보수 할 때 편하게 작업할 수 있을 것 같다. ⭐️

0개의 댓글