网站版式,百度网站大全,多人在线协作网站开发,资源最多的磁力搜索引擎定义#xff1a;
又被称为发布-订阅#xff08;Publish/Subscribe#xff09;模式#xff0c;它定义了一种一对多的依赖关系#xff0c;让多个观察者 对象同时监听某一个主题对象。这个主题对象在状态变化时#xff0c;会通知所有的观察者对象#xff0c;使他们能够自 …定义
又被称为发布-订阅Publish/Subscribe模式它定义了一种一对多的依赖关系让多个观察者 对象同时监听某一个主题对象。这个主题对象在状态变化时会通知所有的观察者对象使他们能够自 动更新自己。
在观察者模式中有如下角色
Subject抽象主题抽象被观察者抽象主题角色把所有观察者对象保存在一个集合里每 个主题都可以有任意数量的观察者抽象主题提供一个接口可以增加和删除观察者对象。ConcreteSubject具体主题具体被观察者该角色将有关状态存入具体观察者对象在具 体主题的内部状态发生改变时给所有注册过的观察者发送通知。Observer抽象观察者是观察者的抽象类它定义了一个更新接口使得在得到主题更改通知 时更新自己。ConcrereObserver具体观察者实现抽象观察者定义的更新接口以便在得到主题更改通知 时更新自身的状态。
案例
这里案例使用一个委托进行多播来进行对热水器的观察
加热器类
首先定义一个全局变量温度temperature然后使用event声明一个事件委托名称使用无返回值的Action参数为int。然后写一个for循环模拟烧水温度temperature大于95时执行事件。
public class HeaterSubject
{private int _temperature;public event Actionint OnBoilEvent;public void BoilWater(){for (int i 0; i 100; i){_temperature;if (_temperature 95){OnBoilEvent.Invoke(_temperature);//触发事件发出警报显示水温}}}
}
监视者
热水器上一般都有显示屏和警报器这里模拟两个观察者分别是显示器和警报器
因为上面声明的委托参数是int这里的观察者参数也要匹配等一下才可以通过多播的形式插入
public class DisPlayObserver
{/// summary/// 显示水温/// /summary/// param nametemperature/parampublic void Display(int temperature){Console.WriteLine($显示屏-当前温度是:{temperature});}
}
public class AlertObserver
{/// summary/// 发出警报/// /summary/// param nametemperature/parampublic void MakeAlert(int temperature){Console.WriteLine($语音报警器-温度是{temperature});}
}
main方法
在main方法中实现new一个热水器的实例然后使用多播将多个方法绑定到一个委托实例。当调用此类委托时所有绑定的方法会被一次全部调用最后调用热水器的烧水方法 public static void Main(string[] args){HeaterSubject subject new HeaterSubject();//订阅发出警报subject.OnBoilEvent new AlertObserver().MakeAlert;//订阅显示水温subject.OnBoilEvent new DisPlayObserver().Display;subject.BoilWater();} 多播的优缺点
优点 降低了目标与观察者之间的耦合关系两者之间是抽象耦合关系。 被观察者发送通知所有注册的观察者都会收到信息【可以实现广播机制】缺点 如果观察者非常多的话那么所有的观察者收到被观察者发送的通知会耗时 如果被观察者有循环依赖的话那么被观察者发送通知会使观察者循环调用会导致系统崩溃 使用场景
对象间存在一对多关系一个对象的状态发生改变会影响其他对象。当一个抽象模型有两个方面其中一个方面依赖于另一方面时。