委托和观察者模式
来源:互联网 发布:安卓软件开发课程 编辑:程序博客网 时间:2024/05/22 08:35
委托在.Net中应用的非常广泛。它实现了对函数的封装,可以当做给方法的特征指定一个名称,将方法当做另一个方法的参数进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中使用过多的判断(条件)语句.现在将从我们生活中常见的事情——水沸腾了进行警报,进行对比实现。
一般写法:
<span style="font-family:SimSun;font-size:14px;">//一般的写法()Public class Heater//热水器{Private int temperature;privatevoidBoilWater()//烧水{for(inti=0;i<=100;i++){temperature=i;}}}Public class Alarm//警报器{Private void MakeAlert(intparam){Console.WriteLine("Alarm:嘀嘀嘀,水已经{0}度了:",param);}}Public class Display//显示器{privatevoidShowMsg(intparam){Console.WriteLine("Display:水已烧开,当前温度:{0}度。",param);}}</span><span style="font-size:18px;font-family: KaiTi_GB2312;"></span>
PS:一般写法是从网上找的,重点在于通过委托和观察者模式对上述代码进行改造
委托改造:
加热器类
<span style="font-family:SimSun;font-size:14px;">//使用委托进行简单改造namespace ConsoleApplication1{ /// <summary> /// 加热器类 /// </summary> class Heater { public void BoilWater(int i) { Console.WriteLine("当前温度:" + i); if (BoilWaterMessage != null)<span style="color:#ff0000;">//如果Heater方法被执行时,没有对象注册事件,则执行BoilWaterMessage</span> { BoilWaterMessage(); } } public delegate void BoilWaterEventHandler();<span style="color:#ff0000;">//声明一个委托,也就是被监听的事件名称</span> public event BoilWaterEventHandler BoilWaterMessage;//<span style="color:#ff0000;">声明BoilWaterMessage 事件类型是上面所声明的委托类型</span> } }</span><span style="font-family:KaiTi_GB2312;font-size:18px;"></span>
警报类
namespace ConsoleApplication1{ /// <summary> /// 警告类 /// </summary> class Alarm { public void MessageAlert() { Console.WriteLine("水以沸腾,请注意安全"); } }}
客户端
主运行程序namespace ConsoleApplication1{ class Program { static void Main(string[] args) { Heater heater1 = new Heater(); Alarm alarm1 = new Alarm(); //将警告类的MessageAlert 方法注册到BoilWaterMessage 委托中 heater1.BoilWaterMessage += new Heater.BoilWaterEventHandler(alarm1.MessageAlert); //原本BoilWater方法,因为被委托了警告事件,因此显示结果为:当前温度:i 水以沸腾,请注意安全 heater1.BoilWater(100); Console.Read(); } }}
运行结果:
通过委托的改造,我们可以这样:委托与其所注册的方法具有完全相同的行为。换而言之,被监听对象(Heater)执行某个方法(BoilWater(100))时,注册在该方法(BoilWater(100))上的被委托方法(MessageAlert ())将会执行,总感觉有点触发器的味道!
观察者模式:
抽象被观察者类:
class AbstractHeater { //声明一个观察者集合类 private IList<Alarm> alarms = new List<Alarm>(); //注册观察者的方法 public void Attach(Alarm alarm) { alarms.Add(alarm); } /// <summary> /// 通知 /// </summary> public void Notify() { foreach (Alarm a in alarms) { a.Update(); } } }
抽象观察者:
abstract class AbstractAlarm { public abstract void Update(); }
被观察内容:
/// <summary> /// 加热器类-被观察者 /// </summary> class Heater:AbstractHeater { private int wendu; //观察者所关注的东西 public int Wendu { get { return wendu; } set { wendu = value; } } }
具体观察者:
/// <summary> /// 警告类 /// </summary> class Alarm : AbstractAlarm { //观察者依赖被观察者 private Heater heater; private String message; public Alarm(Heater heater1, String message1) { this.heater = heater1; this.message = message1; } public override void Update() { Console.WriteLine("当前温度是{0}度,请{1}加温",heater.Wendu,message); } }
客户端:
class Program { static void Main(string[] args) { Heater h1 = new Heater(); h1.Attach(new Alarm(h1, "停止")); h1.Wendu = 100; h1.Notify(); Console.Read(); } }
运行结果:
【.Net&&观察者】小结:
仔细想想.Net中的委托和观察者模式似乎有着异曲同工之妙。步骤也近乎一样:
声明委托(被观察者)===》》》注册对象事件(抽象被观察者,任何在此注册的观察者都会被通知)===》》》将被委托的事件进行注册===》》》委托事件响应,执行被委托事件(被观察者状态改变,观察者进行相应变化)。
0 0
- 委托和观察者模式
- 观察者模式和委托
- C# 观察者模式和委托、事件
- C#委托和事件 观察者模式理解
- c#委托和事件及观察者模式
- 委托和事件——观察者模式
- C# 中的委托和事件 观察者模式
- 观察者模式,事件,委托
- 观察者模式与委托
- 观察者模式和事件委托和代理模式
- 设计模式------观察者模式(ObserverPattern)和委托事件
- C#委托 和代理模式 观察者模式的关系
- 初识c#---委托,事件和观察者模式(Observer)设计模式
- 观察者模式和委托实现 - 老鼠跑,猫叫,人醒
- 用C#中的委托和事件简单实现观察者模式
- C# 中的委托和事件 以及观察者模式
- 委托和事件(五)--例子--涵盖了观察者设计模式
- 观察者模式(Observer)和委托事件模型(DEM)
- android初级阶段总结
- D3D MipMap解析
- 获取异常堆栈消息
- iOS开发OpenGL ES教程之透视
- 字符串
- 委托和观察者模式
- SPOJ AMR 10A Playground 计算几何
- HDU 2602---Bone Collector【01背包】
- POJ 1251 Jungle Roads(Prim or kruskal)
- Flex入门(二)——Flex+BlazeDs+J2ee小实例
- es分布式 索引复制异常:org.elasticsearch.transport.RemoteTransportException: Failed to deserialize exception
- static_cast , dynamic_cast, reinterdivt_cast, 和const_cast
- uva757 - Gone Fishing(贪心)
- throw与throws区别