程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++設計形式之不雅察者形式

C++設計形式之不雅察者形式

編輯:關於C++

C++設計形式之不雅察者形式。本站提示廣大學習愛好者:(C++設計形式之不雅察者形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C++設計形式之不雅察者形式正文


媒介

之前做了一特性能測試的項目,就是須要對如今的產物停止機能測試,取得測試數據,然後書寫測試申報,並提出公道化的改良看法。項目很簡略,我們取得了一系列機能測試數據,關於數據,我們須要在Excel中制造測試數據的折線圖、餅狀圖和柱狀圖,以直不雅的表示出機能的變更。在現實操作時,我發明,假如我修正了一個數據,折線圖、餅狀圖和柱狀圖就都產生了變換。這個是若何做到的?這就要說到明天總結的不雅察者形式了,作為設計形式年夜家庭中最主要的一個,我們不能不去好好的進修一下不雅察者形式。

不雅察者形式

在GOF的《設計形式:可復用面向對象軟件的基本》一書中對不雅察者形式是如許說的:界說對象間的一種一對多的依附關系,當一個對象的狀況產生轉變時,一切依附於它的對象都獲得告訴並被主動更新。當一個對象產生了變更,存眷它的對象就會獲得告訴;這類交互也稱為宣布-定閱(publish-subscribe)。目的是告訴的宣布者,它收回告訴時其實不須要曉得誰是它的不雅察者。

再說說下面的數據和圖之間的關系;不論是折線圖、餅狀圖,照樣柱狀圖,它們都依附於數據;當數據產生變更時,數據對象會告訴依附於它的對象去更新;所以就有了Excel中,當數據產生變更時,對應的統計圖也會主動的重繪。

UML類圖

Subject(目的)
——目的曉得它的不雅察者。可以有隨意率性多個不雅察者不雅察統一個目的;
——供給注冊和刪除不雅察者對象的接口。

Observer(不雅察者)
——為那些在目的產生轉變時需取得告訴的對象界說一個更新接口。

ConcreteSubject(詳細目的)
——將有關狀況存入各ConcreteObserver對象;
——當它的狀況產生轉變時,向它的各個不雅察者收回告訴。

ConcreteObserver(詳細不雅察者)
——保護一個指向ConcreteSubject對象的援用;
——存儲有關狀況,這些狀況應與目的的狀況堅持分歧;
——完成Observer的更新接口以使本身狀況與目的的狀況堅持分歧。

不雅察者形式依照以下方法停止協作:

1.當ConcreteSubject產生任何能夠招致其不雅察者與其自己狀況紛歧致的轉變時,它將告訴它的各個不雅察者;

2.在獲得一個詳細目的的轉變告訴後,ConcreteObserver對象可向目的對象查詢信息。ConcreteObserver應用這些信息以使它的狀況與目的對象的狀況分歧。

以下是挪用時序圖:

應用場所

在以下任一情形下都可使用不雅察者形式:

1.當一個籠統模子有兩個方面,個中一個方面依附於另外一方面。將這兩者封裝在自力的對象中以使它們可以各自自力的轉變和復用;
2.當對一個對象的轉變須要同時轉變其它對象,而不曉得詳細有若干對象有待轉變;
3.當一個對象必需告訴其它對象,而它又不克不及假定其它對象是誰;也就是說,你不願望這些對象是慎密耦合的。

代碼完成


#include <iostream>
#include <list>
using namespace std;
 
class Observer
{
public:
     virtual void Update(int) = 0;
};
 
class Subject
{
public:
     virtual void Attach(Observer *) = 0;
     virtual void Detach(Observer *) = 0;
     virtual void Notify() = 0;
};
 
class ConcreteObserver : public Observer
{
public:
     ConcreteObserver(Subject *pSubject) : m_pSubject(pSubject){}
 
     void Update(int value)
     {
          cout<<"ConcreteObserver get the update. New State:"<<value<<endl;
     }
 
private:
     Subject *m_pSubject;
};
 
class ConcreteObserver2 : public Observer
{
public:
     ConcreteObserver2(Subject *pSubject) : m_pSubject(pSubject){}
 
     void Update(int value)
     {
          cout<<"ConcreteObserver2 get the update. New State:"<<value<<endl;
     }
 
private:
     Subject *m_pSubject;
};
 
class ConcreteSubject : public Subject
{
public:
     void Attach(Observer *pObserver);
     void Detach(Observer *pObserver);
     void Notify();
 
     void SetState(int state)
     {
          m_iState = state;
     }
 
private:
     std::list<Observer *> m_ObserverList;
     int m_iState;
};
 
void ConcreteSubject::Attach(Observer *pObserver)
{
     m_ObserverList.push_back(pObserver);
}
 
void ConcreteSubject::Detach(Observer *pObserver)
{
     m_ObserverList.remove(pObserver);
}
 
void ConcreteSubject::Notify()
{
     std::list<Observer *>::iterator it = m_ObserverList.begin();
     while (it != m_ObserverList.end())
     {
          (*it)->Update(m_iState);
          ++it;
     }
}
 
int main()
{
     // Create Subject
     ConcreteSubject *pSubject = new ConcreteSubject();
 
     // Create Observer
     Observer *pObserver = new ConcreteObserver(pSubject);
     Observer *pObserver2 = new ConcreteObserver2(pSubject);
 
     // Change the state
     pSubject->SetState(2);
 
     // Register the observer
     pSubject->Attach(pObserver);
     pSubject->Attach(pObserver2);
 
     pSubject->Notify();
 
     // Unregister the observer
     pSubject->Detach(pObserver);
 
     pSubject->SetState(3);
     pSubject->Notify();
 
     delete pObserver;
     delete pObserver2;
     delete pSubject;
}

總結

不雅察者形式在23個設計形式中的位置長短常高的,我們根本上各年夜框架中都是到處可見。真實的懂得了全部形式,對我們去懂得他人的代碼有異常年夜的贊助;在我們往後的任務中也會或多或少的應用該設計形式。這裡總結的不是很周全,在往後假如碰著了須要彌補的內容,我會持續彌補的;同時也願望年夜家提出更好的建議。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved