设计模式--观察者模式(发布订阅模式)
2016-08-04 20:19
621 查看
原文链接
理解模型:一个事件触发了,多个动作一起按照先后顺序触发
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 委托与发布订阅者模式 { /** * 机器Machine为被订阅者,维修工Repairer为订阅者 * 工人(订阅者)注册机器的不同事件,并注册回调函数以当相应事件发生时进行处理 * 不同的工人可以只关注他们各自感兴趣的事件 */ // 机器类 public class Machine { // 机器是否正常工作状态 public bool IsWorkWell { get; set; } // 机器故障事件委托 public delegate void MachineBroken(string brokenMsg); public event MachineBroken MachineBrokenEvent; // 机器正常工作事件委托 public delegate void MachineWorkWell(string msg); public event MachineWorkWell MachineWorkWellEvent; // 机器运作 public void Run() { IsWorkWell = false; // 设置机器出故障 if (MachineBrokenEvent != null) // 有订阅者注册机器故障事件 { if (!IsWorkWell) MachineBrokenEvent("机器出故障了,速度过来看下啊,亲~"); } IsWorkWell = true; // 设置机器恢复正常 if (MachineWorkWellEvent != null) // 有订阅者注册机器运行正常事件 { if (IsWorkWell) MachineWorkWellEvent("机器正常运作,不用担心,亲~"); } } } public interface IWorker { string Name { get; set; } void DoJob(string msg); } // BusyWorker注册机器故障事件 public class BusyWorker : IWorker { public string Name { get; set; } public void DoJob(string msg) { Console.WriteLine(string.Format("{0}: 收到信息 < {1} > !马上过来处理,稍等啊~", Name, msg)); } } // IdleWorker注册机器正常工作事件 public class IdleWorker : IWorker { public string Name { get; set; } public void DoJob(string msg) { Console.WriteLine(string.Format("{0}: 收到信息 < {1} > !非常好,这样我就可以多睡会了", Name, msg)); } } public class 发布订阅模式 { //通过委托方法实现的发布订阅模式 static void Main(string[] args) { Machine machine = new Machine(); IWorker busyWorker = new BusyWorker(); busyWorker.Name = "Busy Worker"; IWorker idleWorker = new IdleWorker(); idleWorker.Name = "Idle Worker"; machine.MachineBrokenEvent += new Machine.MachineBroken(busyWorker.DoJob); machine.MachineWorkWellEvent += new Machine.MachineWorkWell(idleWorker.DoJob); ///////////////////////////////////////////////////////////////////////////////////////// // 下面开始验证是否可以为一个事件添加多个订阅者 IWorker busyWorker2 = new BusyWorker(); busyWorker2.Name = "Busy Worker 2"; machine.MachineBrokenEvent += new Machine.MachineBroken(busyWorker2.DoJob); // 试验结果是可以的 // 同样可以使用静态委托,静态委托的好处之一是节省了内存空间 ///////////////////////////////////////////////////////////////////////////////////////// machine.Run(); // 机器开始运作 Console.ReadLine(); } } }
相关文章推荐
- 设计模式二:观察者模式(发布订阅模式)
- 设计模式(三):观察者模式与发布/订阅模式区别
- Java 设计模式之观察者模式(发布/订阅模式)
- 学习javascript设计模式之发布-订阅(观察者)模式
- 我理解的设计模式:观察者模式(订阅发布模式)
- 设计模式(三)观察者模式Observer(发布订阅)
- JS设计模式 - 观察者模式与发布/订阅模式
- 设计模式-观察者模式(发布订阅模式)
- Java设计模式之观察者模式(发布/订阅模式)
- js设计模式中发布与订阅实现观察者模式例子
- 设计模式--观察者模式(发布订阅模式)
- java设计模式-观察者(发布-订阅)模式
- 设计模式(二)观察者模式和发布订阅模式(Observer)
- 十六 设计模式之观察者模式(发布订阅模式)
- javascript设计模式学习之八_发布订阅(观察者)模式
- java笔记--设计模式之观察者(订阅/发布)模式
- 设计模式之观察者模式(发布-订阅模式publish/Subscribe)
- 设计模式初探-观察者模式(OBSERVER)又称发布-订阅(Publish-Subscribe)依赖(Dependents)
- 【JAVA设计模式-第四课】观察者模式-屌丝求职记+新闻订阅
- 设计模式---订阅发布模式(Subscribe/Publish)