1. 模式介绍
模式的定义
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
模式的使用场景
-
关联行为场景。需要注意的是,关联行为是可拆分的,而不是“组合”关系;
-
事件多级触发场景;
-
跨系统的消息交换场景,如消息队列、事件总线的处理机制。
2. UML类图
角色介绍
-
抽象主题 (Subject) 角色
抽象主题角色把所有观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。
-
具体主题 (ConcreteSubject) 角色
将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。
-
抽象观察者 (Observer) 角色
为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。
-
具体观察者 (ConcreteObserver) 角色
存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。
3. 模式的简单实现
-
// 订阅号抽象类
-
public abstract class TenXun
-
{
-
// 保存订阅者列表
-
private List<IObserver> observers = new List<IObserver>();
-
-
public string Symbol { get; set; }
-
public string Info { get; set; }
-
public TenXun(string symbol, string info)
-
{
-
this.Symbol = symbol;
-
this.Info = info;
-
}
-
-
#region 新增对订阅号列表的维护操作
-
public void AddObserver(IObserver ob)
-
{
-
observers.Add(ob);
-
}
-
public void RemoveObserver(IObserver ob)
-
{
-
observers.Remove(ob);
-
}
-
#endregion
-
-
public void Update()
-
{
-
// 遍历订阅者列表进行通知
-
foreach (IObserver ob in observers)
-
{
-
if (ob != null)
-
{
-
ob.ReceiveAndPrint(this);
-
}
-
}
-
}
-
}
-
-
// 具体订阅号类
-
public class TenXunGame : TenXun
-
{
-
public TenXunGame(string symbol, string info)
-
: base(symbol, info)
-
{
-
}
-
}
-
-
// 订阅者接口
-
public interface IObserver
-
{
-
void ReceiveAndPrint(TenXun tenxun);
-
}
-
-
// 具体的订阅者类
-
public class Subscriber : IObserver
-
{
-
public string Name { get; set; }
-
public Subscriber(string name)
-
{
-
this.Name = name;
-
}
-
-
public void ReceiveAndPrint(TenXun tenxun)
-
{
-
Console.WriteLine("Notified {0} of {1}'s" + " Info is: {2}", Name, tenxun.Symbol, tenxun.Info);
-
}
-
}
-
-
// 客户端测试
-
class Program
-
{
-
static void Main(string[] args)
-
{
-
TenXun tenXun = new TenXunGame("TenXun Game", "Have a new game published ....");
-
-
// 添加订阅者
-
tenXun.AddObserver(new Subscriber("Learning Hard"));
-
tenXun.AddObserver(new Subscriber("Tom"));
-
-
tenXun.Update();
-
-
Console.ReadLine();
-
}
-
}
阅读(702) | 评论(0) | 转发(1) |