카테고리 없음
디자인패턴 _ 옵저버 패턴 [ observer pattern ]
i'm suna
2023. 12. 22. 08:05
옵저버 패턴
- 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 (one-to-many) 의존성을 정의합니다.
ex)
- 신문사가 사업을 시작하고 신문을 찍어내기 시작합니다.
- 독자가 특정 시문사/잡지사에 구독신청을 하면 매번 새로운 신문/잡지가 나올때마다 배달을 받을 수 있습니다.
계속 구독자로 남아있는 이상 계속해서 신문/잡지를 바을 수 있습니다. - 신문을 더 이상 보고싶지 않으면 구도 ㄱ해지 신청을 합니다.
그러면 더 이상 신문이 오지 않습니다. - 신문사가 계속 영업을 하는 이상 여러 개인 독자, 호텔, 하공사 및 기타회사 등에서 꾸준히 구독 및 해지를 하게 됩니다.
출반사를 주체(subject), 구독자를 옵저버(observer)라고 부를 수 있습니다.
클래스 다이어그램
주제 역할을 하는 구상 인터페이스
항상 subject인터페이스로 구현
주제 클래스에서는 등록 및 해지를 위한 메소드 외에 상태가 바뀔 때마다 모든 옵저버들에게 연락을 하기위한 notifyObservers() 메소드도 구현해야 한다.
CconcreteSubject
registerObserver(){...}
removeObserver(){...}
notifyObserver(){...}
주제를 나타내는 subject 인터페이스
객체에서 옵접로 등록하거나 옵저버 목록에서 탈퇴하고 싶을 때 사용
<<interface>>
subject
registerObserver()
removeObserver()
notifiObservers()
옵저버가 될 가능성이 있는 객체는 반드시 observer 인터페이스로 구현해야 한다.
<<interface>>
Observer
update()
느슨한 결합 옵저버
- 언제든 새로 추가할 수 있다.
: 주제는 observer 인터페이스를 구현하는 객ㅊ의 목록에만 의존하기 때문에 언제든지 새로운 옵저버를 추가할 수 있다. - 새로운 형식의 옵저버를 추가하려고 할 때도 주제를 변경할 필요가 없다.
: 옵저버가 되어야 하는 새로운 구상 클래스가 생겼다고 가정할 때, 새로운 클래스형식을 받아들일 수 있도록 주제를 바꿔야 할 필요는 없다.
새로운 클래스에서 Observer인터페이스를 구현하고 옵저버로 등록하면 끝 - 주제와 옵저버는 서로 독립적으로 재사용할 수 있다.
서로 단단하게 결합되어 있지 않기 때문에 - 주제나 옵저버가 바뀓라도 서로에게 영향을 미치지 않는다.
서로 느슨하게 결합되어있기 때문에 주제 or 옵저버 인터페이스를 구현한다는 조건만 만족된다면 어떻게 바뀌어도 문제가 생기는일이 없다.
느슨하게 결합하는 디자인을 사용하면 변경사항이 생겨도 무난히 처리할 수 있는 유연한 객체지향 시스템을 구축할 수 있다.
객체 사이의 상호 의존성을 최소화할 수 있기 때문에!