程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
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