중재자 대 관찰자?


27

누군가 a와 a의 차이점에 대한 정식 답변 ObserverMediator한 패턴을 다른 패턴보다 사용해야하는 시점에 대한 요약을 제공 할 수 있습니까?

어떤 종류의 상황이 필요한지, 어떤 종류의 상황이 필요한지 잘 모르겠습니다 Observer.Mediator


7 년 후 이것에 대한 당신의 생각을 알고 싶습니다?
Niing

답변:


19

Observer and Mediator, Design Patterns, Reusable Object-Oriented Software의 요소 라는 용어가 쓰여진 최초의 책 에서 옵저버 패턴을 사용하여 중재자 패턴을 구현할 수 있다고합니다. 그러나 동료 (관찰자 패턴의 주제와 거의 동일)가 중재자 클래스 또는 중재자 인터페이스에 대한 참조를 갖도록하여 구현할 수도 있습니다.

옵저버 패턴을 사용하려는 경우가 많이 있지만, 객체의 다른 객체가 상태를 관찰하는 것을 알지 않아야한다는 것이 핵심입니다.

중재자는 좀 더 구체적이며 클래스가 직접 중재자를 통해 통신하지 않도록합니다. 이를 통해 커뮤니케이션을 처리하는 클래스로 커뮤니케이션을 오프로드 할 수 있으므로 단일 책임 원칙이 도움이됩니다.

전형적인 중재자 예제는 GUI에 있으며 순진한 접근 방식은 "푸 (Foo) 패널이 비활성화되어 있고 막대 패널에"날짜를 입력하십시오 "라는 레이블이 있고 서버를 호출하지 않는 경우 버튼 클릭 이벤트에서 코드를 생성 할 수 있습니다. Mediator 패턴으로 "단지 버튼이고 Foo 패널과 Bar 패널의 레이블에 대해 잘 아는 비즈니스가 없으므로 서버에 전화를 걸면 중재자에게 물어볼 것입니다." 지금은 괜찮습니다. "

또는 관찰자 패턴을 사용하여 구현 된 경우 버튼에 "이봐, 관찰자 ​​(조정자가 포함됨), 상태가 변경되었습니다 (누군가가 나를 클릭했습니다). 필자의 예에서는 아마도 이해가되지 않지만 때로는 그럴 것입니다. 관찰자와 중재자 사이의 차이는 코드 자체의 차이보다 의도의 하나입니다.


고맙습니다. 귀하의 예가 실제로 두 가지의 차이점을 분명히하는 데 도움이되었습니다. 내가 당신을 올바르게 이해한다면, 관찰자 ​​패턴은 통신을 위해 메시지의 가입 / 방송 시스템을 사용하는 반면, 중재자는 객체가 정보를 쿼리 할 수있는 전 세계적으로 액세스 가능한 엔티티와 같습니다.
Rachel

@Rachel-당신이 한 것처럼 관찰자를 설명하겠습니다. 중재자는 아마도 전역 적이 지 않지만, 서로 통신했지만 이제는 중재자를 거치는 세트의 모든 객체에 알려져 있습니다. 중재자가 옵저버로 구현되지 않는 한 모든 개체에 대해 알고 있지만 (적어도 직접 관찰 가능한 인터페이스를 통해) 직접 알지 못합니다.
psr

9

관찰자 패턴은 관찰자 간의 조정이 필요하지 않고 관찰 관계가 한 방향으로 진행될 때 잘 작동합니다 .

예를 들어, 오브젝트 B와 C가 오브젝트 A를 관찰하게하십시오. 오브젝트 A가 이벤트 X를 발생 시키면 오브젝트 B는 메소드 Y ()를 실행하고 오브젝트 C는 메소드 Z ()를 실행해야합니다. BY () 및 CZ () 메소드가 완전히 독립적이며 조정이 필요하지 않으면 옵저버 패턴을 사용하십시오.

반면, CZ () 전에 BY ()를 실행해야하는 경우 중재자가이 조정을 캡슐화하는 중재자 패턴을 사용하려고합니다. 이 시나리오에서 중개자 M은 오브젝트 A를 관찰하고 오브젝트 B 및 C에 대한 참조를 갖습니다. A가 이벤트 X를 발생 시키면 M은 이벤트를 처리하고 규정 된 순서로 BY () 및 CZ ()를 호출합니다.

또한 객체 A, B 및 C가 서로를 관찰해야하는 경우 중재자를 매개자로 사용하면 이러한 객체를 분리하고 스파게티 코드를 피할 수 있습니다.


5

Observer패턴은 한 클래스 (관찰 된 클래스)에서 수행 된 조치가 다른 클래스 (관찰 클래스)에서 반응을 생성해야하는 경우에 사용되지만 관찰 된 클래스가 관찰 클래스에 결합되는 것은 바람직하지 않습니다. 이것은 매우 일반적인 패턴입니다. SAX XML 파서는 좋은 예일 수 있습니다. SAX 구문 분석기를 사용하기 위해 클라이언트 ContentHandler는 구문 분석기 조작을 "관찰"하는 인터페이스를 구현합니다 . 파서가 XML 문서의 요소를 만나면의 메소드를 호출합니다 ContentHandler. 파서는 클라이언트 코드를 호출 할 수 있지만 파서는 클라이언트 코드에 연결되지 않습니다.

Mediator패턴은 일련의 객체 사용 패턴을 캡슐화 한 것입니다. 클라이언트 코드는 여러 다른 클래스에 연결되지 않고 중재자에만 연결됩니다. 캡슐화 된 개체의 수명이 중재자의 수명과 무관하다는 점을 제외하면 집계와 비슷합니다.


1

간단한 용어로 (기억하기 위해 사용) :

관찰자 : 한 오브젝트가 다른 오브젝트의 상태 변경을 알리려고 할 때 사용합니다 (엄격히 말해서 이벤트를 사용하는 것은 관찰자입니다)

중재자를 이해하기 위해 Facade를 먼저 고려할 때 더 쉽다는 것을 알게되었습니다. Facade는 개별 클래스의 기능 (전체 서브 시스템)을 집계하고 해당 기능을 단일 인터페이스로 제공합니다.

중재자 : 모든 집계 클래스의 기능을 결합하여 새로운 기능 을 생성한다는 점을 제외하면 Facade와 동일 합니다. ( 여기에 좋은 설명 )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.