設計模式:觀察者模式(observer)
設計模式:觀察者模式(observer)
-
這種設計模式大量的使用,簡單的說就是觀察者透過被觀察者來獲得外界某種事物的狀態
-
Observer模式提供給關聯物件一種同步通訊的手段,使某個物件與依賴它的其他物件之間保持狀態同步。
如下圖:
-
被觀察者(concreteSubject):其中必然包含了一個觀察者的列表,用於狀態發生變化的時候透過連結串列進行通知每個觀察者做出相應的變化
-
觀察者(ConcreteObserver):其中必然包含各種應對外界狀態變化的方法,以供被觀察者呼叫
-
圖中還有抽象類Subject和Observer其具體的被觀察者和觀察者可以透過虛擬函式從寫的方式來重寫這些定義好的介面
那麼我們做一個列子如下,比如上課的學生等待上課和下課的鈴音,那麼學生就是觀察者上下課鈴就是被觀察者如下:
點選(此處)摺疊或開啟
-
/*************************************************************************
-
> File Name: test.cpp
-
> Author: gaopeng QQ:22389860 all right reserved
-
> Mail: gaopp_200217@163.com
-
> Created Time: Sat 25 Nov 2017 05:13:21 AM CST
-
************************************************************************/
-
-
#include<iostream>
-
#include "vector"
-
#include "string"
-
#include<string.h>
-
-
using namespace std;
-
-
-
class StuObserver
-
{
-
-
private:
-
char name[256];
-
public:
-
StuObserver(const char* name)
-
{
-
cout<< name<<"加入學習班!"<<endl;
-
strcpy(this->name,name);
-
}
-
int class_begin()
-
{
-
-
cout<<name<<" 上課開始學習!"<<endl;
-
return 0;
-
}
-
int class_end()
-
{
-
-
cout<<name<<" 結束學習下課!"<<endl;
-
return 0;
-
}
-
};
-
-
-
class bell
-
{
-
-
private:
-
vector<StuObserver* > v;//包含所有觀察者
-
int i;
-
public:
-
bell()
-
{
-
i = 0;
-
v.clear();
-
}
-
~ bell()
-
{
-
-
v.clear();
-
for(i=0; i<v.size(); i++)
-
{
-
delete v[i];
-
v[i]=NULL;
-
}
-
}
-
int addObserver(StuObserver *o)
-
{
-
-
v.push_back(o);
-
return 0;
-
}
-
-
int begin_class(const char* class_name)
-
{
-
-
cout<<"每位同學注意:"<<class_name<<"開始了上課了!!"<<endl;
-
for(i=0; i<v.size(); i++)
-
{
-
-
v[i]->class_begin();
-
}
-
return 0;
-
}
-
-
int end_class(const char* class_name)
-
{
-
-
cout<<"每位同學注意:"<<class_name<<"結束了下課了!!"<<endl;
-
for(i=0; i<v.size(); i++)
-
{
-
-
v[i]->class_end();
-
}
-
return 0;
-
}
-
};
-
-
-
-
int main(void)
-
{
-
-
-
bell m;
-
StuObserver* a=new StuObserver("高鵬1");
-
StuObserver* b=new StuObserver("高鵬2");
-
StuObserver* c=new StuObserver("高鵬3");
-
StuObserver* d=new StuObserver("高鵬4");
-
-
m.addObserver(a);
-
m.addObserver(b);
-
m.addObserver(c);
-
m.addObserver(d);
-
-
m.begin_class("數學");
-
m.end_class("數學");
-
m.begin_class("語文");
-
m.end_class("語文");
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2148092/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 設計模式之觀察者模式(Observer Pattern)設計模式Server
- 人人都會設計模式—觀察者模式–Observer設計模式Server
- 人人都會設計模式---觀察者模式--Observer設計模式Server
- C#設計模式系列:觀察者模式(Observer)C#設計模式Server
- Head First 設計模式(2)---觀察者(Observer)模式設計模式Server
- 設計模式-- 觀察者模式Observer(物件行為型)設計模式Server物件
- C#設計模式(17)——觀察者模式(Observer Pattern)C#設計模式Server
- Java23種設計模式【22】----》觀察者模式(Observer)Java設計模式Server
- 設計模式(三)觀察者模式Observer(釋出訂閱)設計模式Server
- observer-觀察者模式Server模式
- Visitor模式和Observer觀察者模式模式Server
- 設計模式----觀察者模式設計模式
- 設計模式 —— 觀察者模式設計模式
- 設計模式(觀察者模式)設計模式
- 設計模式——觀察者模式設計模式
- 設計模式-觀察者模式設計模式
- 設計模式_觀察者模式設計模式
- 【設計模式】觀察者模式設計模式
- 設計模式(十六)觀察者模式設計模式
- PHP設計模式-觀察者模式PHP設計模式
- 設計模式(9) 觀察者模式設計模式
- 設計模式-觀察者模式上設計模式
- 設計模式-觀察者模式下設計模式
- Java設計模式-觀察者模式Java設計模式
- 設計模式解析:觀察者模式設計模式
- JS設計模式(觀察者模式)JS設計模式
- 設計模式之觀察者模式設計模式
- 設計模式 #6 (觀察者模式)設計模式
- 設計模式之-觀察者模式設計模式
- 設計模式之【觀察者模式】設計模式
- javascript設計模式觀察者模式JavaScript設計模式
- 設計模式----Observer模式設計模式Server
- 設計模式-單例模式,觀察者模式設計模式單例
- PHP 設計模式之觀察者模式PHP設計模式
- PHP設計模式之觀察者模式PHP設計模式
- Go 設計模式之觀察者模式Go設計模式
- 設計模式之觀察者模式(一)設計模式
- JavaScript設計模式之觀察者模式JavaScript設計模式