c++ 옵저버 패턴 예제

각 피사체에는 많은 관찰자가 있을 수 있습니다(벡터 관찰자;). 기상 관측소의 예를 생각해 보십시오. 클라이언트 집합(예: 웹 앱, 모바일 앱)을 가질 수 있습니다. 각 클라이언트는 기상 관측소의 상태에 변화가있을 때마다 알아야하며, 그렇지 않으면 클라이언트는 실시간으로 정확한 결과를 표시 할 수 없습니다. 관찰자 패턴은 이러한 종류의 상황에 대한 솔루션입니다. 이 시나리오에서는 기상 관측소를 게시자(제목)로 사용할 수 있으며 각 클라이언트를 구독자(관찰자)로 사용할 수 있습니다. 이 문제에는 관찰자 패턴과 같은 하나의 쉬운 솔루션이 있습니다. 이것은 관찰자 패턴에 대한 내 자신의 두 번째 기사입니다. C #의 관찰자 구현에 대해 이야기하는 비슷한 기사가 있습니다. 이 기사는 C ++ 초보자에게 유용 할 수 있으며 기사에서 얻는 귀중한 의견은 더 많은 것을 배울 수 있으므로 공유 할 가치가 있다고 생각합니다. 감마의 “디자인 패턴”이라는 책의 예는 다음과 같습니다. 이 문서에서는 관찰자 패턴의 기본 을 다루고 C++에서 기본 구현을 제공합니다.

나는 또한 C #에서 동일을 구현했다. 관찰자 패턴이 작동하는 방식과 C++ 및 C#에서 구현할 때의 유사점과 차이점은 무엇입니까? 신호 및 슬롯은 Qt에 도입된 언어 구문으로, 상용구 코드를 피하면서 관찰자 패턴을 쉽게 구현할 수 있습니다. 개념은 컨트롤(위젯이라고도 함)이 슬롯이라는 특수 기능을 사용하여 다른 컨트롤에서 수신할 수 있는 이벤트 정보를 포함하는 신호를 보낼 수 있다는 것입니다. Qt의 슬롯은 이와 같이 선언된 클래스 멤버여야 합니다. 모든 관찰자는 관찰자 인터페이스를 구현해야 합니다. 이 인터페이스에는 피사체의 상태가 변경될 때 호출되는 한 가지 방법인 Update()가 있습니다(제목 업데이트(제목 및)) 가장 간단한 방법으로 인기 있는 관찰자 디자인 패턴(게시/구독)을 C++에서 구현하는 방법을 살펴보겠습니다. 여기서는 기상 관측소 예제를 사용하여 기상 관측소의 온도, 습도 및 압력이 변경될 때 모든 클라이언트가 즉시 알림을 받을 수 있는 관찰자 패턴을 설명하고 있습니다. Attach() 및 Detach() 메서드 외에도 구체적인 주체는 상태가 변경될 때마다 모든 현재 관찰자를 업데이트하는 데 사용되는 Notify() 메서드를 구현합니다. 그러나이 경우, 그들 모두는 부모 클래스에서 이루어집니다, 주제 (제목 ::연결 (관찰자&), 무효 제목 ::Detach (관찰자)와 무효 제목 ::Notify() . 다음은 관찰자 패턴에 대한 클래스 다이어그램입니다(참조: GoF 디자인 패턴) 여기서 중요한 점은 WeatherStation 클래스가 클라이언트에 대해 알 필요가 없다는 것입니다.

관찰자가 관찰자 인터페이스를 구현하고 그 반대의 경우도 마찬가지입니다. 구체적인 관찰자는 관찰자 인터페이스를 구현하는 모든 클래스일 수 있습니다. 각 관찰자는 업데이트를 받을 구체적인 주제(제목)를 구독(등록)합니다. 첨부(*이); ). 신호 및 슬롯은 Qt에 도입된 언어 구문으로, 상용구 코드를 피하면서 관찰자 패턴을 쉽게 구현할 수 있습니다. 개념은 컨트롤(위젯이라고도 함)이 슬롯이라는 특수 기능을 사용하여 다른 컨트롤에서 수신할 수 있는 이벤트 정보를 포함하는 신호를 보낼 수 있다는 것입니다. Qt의 슬롯은 이와 같이 선언된 클래스 멤버여야 합니다. 신호/슬롯 시스템은 그래픽 사용자 인터페이스가 설계되는 방식과 잘 맞습니다. 마찬가지로 신호/슬롯 시스템은 비동기 I/O(소켓, 파이프, 직렬 장치 등) 이벤트 알림또는 시간 시간 이벤트를 적절한 개체 인스턴스 및 메서드 또는 기능과 연결하는 데 사용할 수 있습니다.

Qt의 META 개체 컴파일러(MOC)가 필요한 인프라를 자동으로 생성하므로 등록/등록 취소/호출 코드를 작성할 필요가 없습니다.