2012-06-15 3 views
2

나는 AB이라는 옵저버가있는 클래스 C이 있습니다. 옵저버 B은 수신 한 객체의 상태를 수정하므로 다시 A으로 통보해야합니다. 지금까지 나는 단순히 관찰자 B에서 다시) (클래스 C를 notifyObserver를 호출했지만이 몇 가지 문제가 있습니다 :이 업데이트를 제기하기 때문에옵저버가 객체 상태를 수정할 때 옵저버 패턴 사용

  • 하드 두 번째 업데이트를 무시
  • B 요구 사항을 이해하기 위해

처음 생각한 점은 BA 인 사용자에게 자신의 관찰자에게 B의 옵저버로도 등록되었음을 알리는 것이 었습니다.

더 좋은 방법이 있나요? 이것을 달성하기 위해 다른 패턴을 사용해야합니까?

답변

1

아마도 Mediator pattern이 당신이 찾고있는 것일 수 있습니다.

이 패턴에는 여러 (다른) 동료 객체 간의 통신을 처리하는 디렉터가 있습니다. 동료들은 직접 디렉터를 알고 있으며 의사 소통 만합니다. 감독은 동료들을 관리합니다. 따라서 동료 객체를 분리하고 통신 프로토콜을 완화합니다.

어쩌면 당신은 당신의 필요에 적응할 수 있습니다.

+0

당신의 의견을 올바르게 이해합니다. 여러분은 객체가'B' 그 자체가 아닌 다른 누군가에 의해 수정 될 때 나는 관찰자'B'에게 통지해야한다고 말하고 있습니다. 그리고 이것을 결정하는 논리는 중재자에있을 것입니다. – Gaurav

+0

예, 아마도 작동 할 것입니다. * observer * 알림을 중재자에 추가 할 수 있습니다. 메소드'register_C_Observers'와'register_ObjectChange_Observer'를 가질 수 있습니다. 그런 다음 메소드'notify_C_Observers'와'notify_ChangeObject_Observers'가 있습니다. 나는 이것이 메디 에이터 패턴의 정확한 * 명세를 확신하지 못한다. 하지만 통신을 하나의 클래스로 분리하면 코드가 명확해질 수 있습니다. – matcauthon

1

관찰자를 관찰자에게 소개하면 안됩니다 (B 관찰 A). 그것은 쓰거나 디버그하는 재미있는 시간처럼 들리지 않습니다.

나는 당신이 여기에있는 것이 순환 종속성이라고 생각한다. 옵서버 패턴은 관찰자가 관찰 된 현재 상황을 반영 할 필요가있을 때 실제로 잘 작동하지만 직접적인 관계는 없습니다. 이 특별한 경우처럼 저에게 들립니다. A는 C가 상태를 변경하기에 충분하다는 것을 알고 있지만 Observer 패턴을 사용하여 C에서 A로 직접 이동할 수있는 정보를 전달한다는 점에서 C와의 직접적인 관계가 있습니다. 당신이 지금 사건의 다른 "종류"를 가지고 있다는 사실, 즉 A 종류가 생성하고 "다른"종류가 있다는 것 또한 C와 A 사이의 관계가 C와 B 사이에있는 관찰자/관찰 된 관계가 아니라는 것을 암시합니다. C와 A도 일대일로? 그것은 단순히 여기에 잘못된 패턴을 적용하고 있다는 더 많은 증거가 될 것입니다. 반면에, 한 B가 여러 C에게 서비스를 제공 할 수 있거나 그 반대의 경우, B와 C가 관찰자/관찰자라는 증거입니다.

내 자신의 코드에서 이런 일이 발생했습니다. 내 C의 변경으로 재귀가 발생하여 C가 다른 이벤트를 보내면 A가 동일한 작업을 다시 수행하게됩니다. 내가 특별히 좋아하지 않는 당시 발견 한 해법은 관측자의 다른 "범주"를 소개하고 관측자 목록과 관찰자 목록 및 각 카테고리에 대한 본질적으로 다른 종류의 이벤트를 유지하여 관측 및 관측자와 대화 할 수있는 범주를 유지하는 것이 었습니다. 새 이벤트가 발생하면 다른 카테고리에서 본 이벤트 만 발생합니다. 즉, 상위 수준 관찰자와 하위 수준 관찰자 및 상위 수준 관찰자 만 낮은 수준의 이벤트를 트리거 할 수 있습니다. 내가 말했듯이, 나는 그것을 좋아하지 않는다. :)

요약하면 C와 A의 관계를 명시 적으로 지정하고 Observer를 사용하여 C와 B를 그대로 두는 것이 좋습니다.

+0

사례를 단순화했습니다. 'A'와 같은 많은 관찰자가 있습니다. 범주를 사용한다는 것은 이러한 모든 관찰자를 해당 범주로 이동시키고 'B'를 별도 범주로 유지한다는 것을 의미합니다. 그게 네가 제안하는거야? – Gaurav