1. 程式人生 > >c++設計模式----觀察者模式

c++設計模式----觀察者模式

設計模式是軟體工程的基石脈絡,如同大廈 的結構一樣。設計模式的分類,可分為建立型模式,結構性模式,行為型模式。

1 建立型模式:通常和物件的建立有關,涉及到物件的例項化方式。大概有五種模式

工廠方法模式 定義一個建立產品物件的工廠介面,將實際建立工作推遲到子類
抽象工廠模式 建立一系列相關或者相互依賴的介面,而無需指定他們具體的類
   
建造者模式 將一個複雜分構建與其分離,使得同樣的構建過程中可以建立不同的表示
原型模式 原型例項指定建立物件的種類,並且通過這些原型來建立新的物件
單例模式 是保證一個類僅有一個例項,並且提供它一個訪問它的全域性訪問點

2 結構性模式:描述的是如何組合類和物件以獲得更大的結構。大概有以下幾種模式

代理模式 就是為其他物件提供一種代理以控制對這個物件的訪問。
裝飾者模式 動態的給一個物件新增一些額外的職責。就增加功能來說,此模式比生成子類更為靈活。 
介面卡模式 是將一個類的介面轉換成客戶希望的另外一個介面。使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
橋接模式 是將抽象部分與實際部分分離,使它們都可以獨立的變化。
組合模式 是將物件組合成樹形結構以表示“部分--整體”的層次結構。使得使用者對單個物件和組合物件的使用具有一致性。
外觀模式(Facade Pattern) 是為子系統中的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
   

3行為型模式:用來對類或物件怎樣互動和怎樣分配職責進行描述

模板方法模式(Template Method Pattern) 使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 
命令模式(Command Pattern 是將一個請求封裝為一個物件,從而使你可用不同的請求對客戶端進行引數化;對請求排隊或記錄請求日誌,以及支援可撤銷的操作。
 
責任鏈模式(Chain of Responsibility Pattern) 在該模式裡,很多物件由每一個物件對其下家的引用而連線起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個物件決定處理此請求,這使得系統可以在不影響客戶端的情況下動態地重新組織鏈和分配責任。
策略模式(Strategy Pattern) 就是準備一組演算法,並將每一個演算法封裝起來,使得它們可以互換。
中介者模式(Mediator Pattern) 就是定義一箇中介物件來封裝系列物件之間的互動。終結者使各個物件不需要顯示的相互呼叫 ,從而使其耦合性鬆散,而且可以獨立的改變他們之間的互動。
 
觀察者模式 )定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。
備忘錄模式(Memento Pattern) 在不破壞封裝的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。
訪問者模式(Visitor Pattern) 就是表示一個作用於某物件結構中的各元素的操作,它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
 
狀態模式(State Pattern) )就是物件的行為,依賴於它所處的狀態。
直譯器模式(Interpreter Pattern) 就是描述瞭如何為簡單的語言定義一個語法,如何在該語言中表示一個句子,以及如何解釋這些句子。 
 

設計模式的基本準則,設計模式體現的軟體設計的思想,而不是軟體技術,她重在使用多型和抽象類來解決問題

1 開放封閉原則:

 類的改動是通過增加程式碼進行的,而不是修改原始碼

2依賴倒置原則:

依賴於抽象(介面),不要依賴具體的實現(類),也就是針對介面程式設計

 

 3 迪米特原則:一個軟體實體應當儘可能少地與其他實體發生相互作用

下面我用例項來說明行為型模式中的觀察者模式

Observer模式是行為模式之一,它的作用是當一個物件的狀態發生變化時,能夠自動通知其他關聯物件,自動重新整理物件狀態。
Observer模式提供給關聯物件一種同步通訊的手段,使某個物件與依賴它的其他物件之間保持狀態同步。

模式中包含的角色和職責


 

 

#include <iostream>
#include <list>
#include <string>

using namespace std;
//定義一個抽象的通知著
class Observer;

class inform
{
public:
	virtual void sendInformationToObserver(string _strContent) = 0;
	virtual void addObserver(Observer *) = 0;
	virtual void deleteObserver(Observer *) = 0;
protected:
	list<Observer *> m_list;
};
//重新的觀察者
class Observer
{
public:
	virtual void  updateState(string _strContent) = 0;
	virtual void  subscribe(inform *) = 0;
	virtual void  disubscribe(inform *) = 0; //觀察者也可以自身訂通知者

};
class monitor : public inform
{
public:
	void addObserver(Observer *whichPerson)
	{
		m_list.push_back(whichPerson);
	}
	void deleteObserver(Observer *whichPerson)
	{
		m_list.remove(whichPerson);
	}
	void sendInformationToObserver(string _strContent)
	{
		for (list<Observer*>::iterator it = m_list.begin();it!= m_list.end();it++)
		{
			(*it)->updateState(_strContent);
		}

	}

};

class xiaoMing:public Observer
{
public:
	void updateState(string _strContent)
	{
		cout << _strContent << endl << "我要寫作業了"<<endl;
	}
	void subscribe(inform *whichInform)//觀察者可以訂閱哪個通知者
	{
		whichInform->addObserver(this);
	}
	void disubscribe(inform *whichInform)
	{
		whichInform->deleteObserver(this);
	}

};
int _tmain(int argc, _TCHAR* argv[])
{
	
	inform * object = new monitor;
	Observer *object1 = new xiaoMing;

	object->addObserver(object1);
	object->sendInformationToObserver("老師來了");
    
	return 0;
}