设计模式--观察者模式(C++)
来源:互联网 发布:python字母验证码识别 编辑:程序博客网 时间:2024/04/26 21:14
一、什么是观察者模式
Observer模式也叫观察者模式,是由GoF提出的23种软件设计模式的一种。Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象。在刚才的例子中,业务数据是被观察对象,用户界面是观察者。观察者和被观察者之间存在“观察”的逻辑关联,当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。如果在用户界面、业务数据之间使用这样的观察过程,可以确保界面和数据之间划清界限,假定应用程序的需求发生变化,需要修改界面的表现,只需要重新构建一个用户界面,业务数据不需要发生变化。
“观察”不是“直接调用”
实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则。无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用。
实现观察者模式的形式
实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——撤销注册”的形式。
实现观察者模式例子
下面是C++的实现,在C++实现中,C++中没有接口的概念,但是可以用抽象类类代替Java或C#中的接口,在C++中抽象类中从派生类中抽象出来的函数(方法),必须定义成纯虚函数,这样在后面的使用中才可以通过基类的指针来访问这些函数,面向对象的语言中有个特点,多态只能访问两者中共有的部分。
#include
#include
#include
using namespace std;
class Observer;
class Subject
{
public:
virtual void attach(Observer *o)=0;
virtual void change()=0;
virtual void setWeather(string str)=0;
virtual string getWeather()=0;
};
class Observer
{
public:
virtual string getName()=0;
virtual void update(Subject *s)=0;
};
class Earth:public Subject
{
private:
string weather;
list *l;
public:
Earth()
{
l = new list();
}
void attach(Observer *o)
{
this->l->push_back(o);
};
void change()
{
for(list::iterator it=l->begin();it!=l->end();++it)
{
(*it)->update(this);
}
};
void setWeather(string str)
{
this->weather=str;
change();
};
string getWeather()
{
return this->weather;
};
};
class Satellite:public Observer
{
private:
string name;
public:
Satellite(string str)
{
name=str;
}
string getName()
{
return name;
};
void update(Subject *s)
{
cout〈〈this->getName()+" "+s->getWeather()<};
};
int main()
{
Earth e;
Satellite *s1 = new Satellite("风云一号");
Satellite *s2 = new Satellite("风云二号");
Satellite *s3 = new Satellite("风云三号");
Satellite *s4 = new Satellite("风云四号");
e.attach(s1);
e.attach(s2);
e.attach(s3);
e.attach(s4);
e.setWeather("fine");
return 0;
}
- 设计模式--观察者模式(C++)
- 设计模式--观察者模式(C++)
- 设计模式--观察者模式(C++)
- 设计模式----观察者模式Observer(C++)
- 设计模式之观察者模式(C++)
- 设计模式---观察者模式(C++)
- 设计模式之观察者模式(c++)
- 设计模式(观察者模式)
- Observer 观察者模式 (HeadFirst设计模式 c#)
- C语言和设计模式(观察者模式)
- C语言和设计模式(观察者模式)
- C语言和设计模式(观察者模式)
- 07.C语言和设计模式(观察者模式)
- 20、C语言和设计模式(观察者模式)
- 设计模式——观察者模式(C++)
- 学习设计模式--观察者模式(C++)
- 学习设计模式--观察者模式(C++)
- 观察者模式(C++)
- asp iis 错误信息 解答[转]
- 历史名人 明朝成化仙游抗倭首领总捕头——魏升
- org.eclipse.ui.actionSets扩展点(zz自javaeye hoodman的博客)
- 给C++初学者的50条忠告
- awk文本处理总结(入门,中级,高级)
- 设计模式--观察者模式(C++)
- PKU_2000_Gold Coins
- linux shell编程
- kaptcha 简单方便的验证码生成工具
- java漂亮样式的鼠标提示
- ifconfig 命令使用及结果分析
- 2222222
- java 浮动窗口,按钮凸显功能
- 自定义连接数据库类