您的位置:首页 > 其它

设计模式--观察者模式(发布订阅模式)

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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: