设计模式——行为性——观察者模式

来源:互联网 发布:淘宝外卖和饿了么合并 编辑:程序博客网 时间:2024/05/18 15:55

1、定义:一个对象状态改变时(目标对象),所有依赖他的对象(观察者对象)都需要发生改变。

示例:有一个Sender类,负责数据的发送,Display类和Media类都需要调用Sender类中的方法进行数据发送,当网络连接断开时,需要通知Display和Media类停止数据发送。

紧耦合设计:

#include<iostream>#include <list>using namespace std;class Display{public:void SendData(){   cout<<"Send Display Data"<<endl;}void NotifyNetError(){cout<<"Display Recieve Net Error!!"<<endl;}};class MultiMedia{public:void SendData(){cout<<"Send MultiMedia Data"<<endl;}void NotifyNetError(){cout<<"MultiMedia Recieve Net Error!!"<<endl;}};class Socket{public:Socket(Display* disp,MultiMedia* media)  //紧耦合设计,依赖具体实现细节{display_module = disp;media_module = media;}void Notify()   //当网络异常时,通知Display和media{display_module->NotifyNetError();  //紧耦合设计,当再增加一个模块时,需要更改这里。media_module->NotifyNetError();}private:   Display* display_module;    //依赖具体实现细节   MultiMedia* media_module;};#include "Test.h"int main(){  Display* disp = new Display;MultiMedia* mulit = new MultiMedia;    Socket* senddata = new Socket(disp,mulit);senddata->Notify();return 0;}  

采用观察者模式的松耦合设计

#include<iostream>#include <list>using namespace std;class Observer{public:virtual void NotifyNetError() = 0;};class Display:public Observer{public:void SendData(){   cout<<"Send Display Data"<<endl;}void NotifyNetError(){cout<<"Display Recieve Net Error!!"<<endl;}};class MultiMedia:public Observer{public:void SendData(){cout<<"Send MultiMedia Data"<<endl;}void NotifyNetError(){cout<<"MultiMedia Recieve Net Error!!"<<endl;}};class Socket{public:Socket(){}void AddModule(Observer* module){         Modulelist.push_back(module);}void Notify(){for (list<Observer*>::iterator it= Modulelist.begin();it!=Modulelist.end();++it){(*it)->NotifyNetError();}}private:list<Observer*> Modulelist;  //解耦设计,依赖接口而不依赖具体实现。};#include "Test.h"int main(){  Observer* disp = new Display;Observer* mulit = new MultiMedia;    Socket* senddata = new Socket;senddata->AddModule(disp);senddata->AddModule(mulit);senddata->Notify();return 0;}  



原创粉丝点击