c语言观察者模式,编程 设计模式
观察者模式定义:
定义了对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖对象都会得到通知并自动更新。
观察者模式也称为发布/订阅模式、模型/视图模式、源/侦听器模式或从属模式。
观察者模式定义了一对多的依赖关系,允许多个观察者对象同时监听某个主题对象。当这个subject对象的状态发生变化时,它会通知所有的observer对象,以便它们可以自动更新自己。正如您所看到的,在这个观察者模式的实现中有以下角色:
抽象主体角色:主体角色将所有对被观察主体的引用保存在一个集合中,每个主体可以有任意数量的观察者。本主题提供了添加和删除观察者对象的界面。主题角色也称为抽象可观察角色,通常由抽象类或接口实现。
抽象观察者角色:为所有具体的观察者定义一个接口,当他们被通知主题时更新他们自己。这个接口叫做更新接口。抽象观察者角色通常由抽象类或接口实现。在这个示意性实现中,更新接口只包含一个方法(即update()方法),称为Update方法。
特定主体角色:将相关状态存储到特定观察者对象中;当特定主题的内部状态发生变化时,通知所有注册的观察者。具体话题角色也叫具体观察角色。特定的主题角色通常由特定的子类实现。
ConcreteObserver的作用:存储与主题状态自洽的状态。具体观察者角色实现抽象观察者角色所需的更新接口,从而使自身状态与主题状态相协调。如有必要,特定的观察者角色可以保存对特定主题对象的引用。具体的观察者角色通常由具体的子类实现。
关于观察者的一切,主体只知道观察者实现了一个接口(Observer)。主体不需要知道观察者的具体阶层是谁,做过什么或者其他任何细节。
我们可以随时添加新的观察员。因为主题唯一依赖的是实现观察者接口的对象列表。当一个新类型的观察者出现时,主题的代码不需要修改。您所要做的就是在一个新的类中实现这个observer接口,然后注册为一个observer。
虚拟void register Observer(Observer * o)=0;//注册观察员
虚拟void remove Observer(Observer * o)=0;//删除观察者
虚拟void notify observer()=0;//当主题状态改变时通知所有观察者
//公告栏显示
类显示元素{
公共:
虚拟void display()=0;
//WeatherData具体类,继承自主题抽象类
类天气数据:公共主题{
私人:
向量观察者*观察者;
浮子温度;
浮谦逊;
浮子压力;
公共:
WeatherData(){}
~WeatherData(){
vector Observer *:iterator pos=observers . begin();
for(;pos!=observers . end();位置)
删除(* pos);
void register Observer(Observer * o){
observers . push _ back(o);
void remove Observer(Observer * o){
向量观察者*:迭代器pos=find(observers.begin(),
observers.end(),o);
如果(pos!=observers.end())
observers . erase(pos);
void notifyObserver()
vector Observer *:iterator pos=observers . begin();
for(;pos!=observers . end();位置)
(*位置)-更新(温度、湿度、压力);
//当从气象站获得更新的观测值时,通知观测者。
void messagements changed(){
notify observer();
//设置气象站的观测值
无效设置测量值(浮子温度、浮子湿度、浮子压力){
setConditionTimes
this- temperature=温度;
这——谦卑=谦卑;
this- pressure=压力;
messurementchanged();
//公告板的具体类别:当前情况
类CurrentConditionDisplay:公共观察者,公共显示元素{
私人:
浮子温度;
浮谦逊;
主题*天气数据
公共:
CurrentConditionDisplay(Subject * weatherData){
this-天气数据=天气数据;
天气数据-登记观测者(this);
~CurrentConditionDisplay(){}
无效更新(浮动温度、浮动米虎、浮动压力){
this-temp=temp;
这——谦逊=米虎;
显示();
空的显示(){
cout 当前条件: 温度华氏度和
谦卑"%谦卑“恩德尔
//布告板具体类:气象统计类
类别天气统计显示:公共观察者,公共显示元素{
私人:
浮点平均温度,最高温度,最低温度
主题*天气数据
公共:
天气统计显示(主题*天气数据){
this-天气数据=天气数据;
天气数据-登记观测者(this);
~WeatherStatisticsDisplay(){}
无效更新(浮动温度、浮动米虎、浮动压力){
if (1==setConditionTimes)
this-avg温度=temp
this-maxTemperature=temp;
this-minTemperature=temp;
否则{
this-avg温度=(this-avg温度*(setConditionTimes-1)temp)/setConditionTimes;
this-maxTemperature=this-maxTemperature temp?最高温度:temp
最低温度=最低温度?this-min温度:temp
显示();
空的显示(){
cout 平均/最大/最小:温度平均温度/
最高温度/最低温度endl
int main()
天气数据*天气数据=新天气数据();
CurrentConditionDisplay * CurrentConditionDisplay=new CurrentConditionDisplay(weatherData);
weather statistics display * weather statistics display=new weather statistics display(天气数据);
气象数据-设置测量值(80,65,30.4 f);
气象数据-设置测量值(82,70,29.2 f);
气象数据-设置测量值(78,90,29.2 f);
天气数据-移除观察者(天气统计显示);
“cout”在移除观察者气象统计数据后显示:" endl
气象数据-设置测量值(80,65,30.4 f);
气象数据-设置测量值(82,70,29.2 f);
气象数据-设置测量值(78,90,29.2 f);
返回0;
}
运行结果(VS2008 Win7):
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。