c语言观察者模式,编程 设计模式

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: