您的位置:首页 > 其它

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

2013-11-29 22:57 316 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: