观察者模式

一、观察者对象在触发某个事件的时候会通知在观察者对象中注册的其他对象

二、使用抽象接口实现对象的松耦合,即观察者可以注册支持某个接口的所有对象,而被注册的对象也只依赖于支持某个接口观察者对象。

例如:邮局相对于一个观察者,每个邮局都有一个接口,发送快递。

        每个客户相对于不同的接收者,邮局在收到快递后,会通知收信的客户。

View Code
/// <summary>
/// 观察者对象的抽象实现
/// </summary>
public abstract class Inform
{
protected List<IViewer> Viewers = new List<IViewer>();

public string State { get; set; }

public void Append(IViewer viewer) {
this.Viewers.Add(viewer);
}

public void Remove(IViewer viewer) {
this.Viewers.Remove(viewer);
}

public virtual void Update() {
foreach (IViewer viewer in this.Viewers) {
viewer.Update(
this);
}
}
}
View Code
/// <summary>
/// 观察者A
/// </summary>
public class InformA:Inform
{
public InformA() {
this.State = "狼来了";
}
}

/// <summary>
/// 观察者B
/// </summary>
public class InformB : Inform
{
public InformB()
{
this.State = "狗来了";
}
}
View Code
/// <summary>
/// 接收者对象的抽象接口
/// </summary>
public interface IViewer
{
void Update(Inform inform);
}
View Code
public class ViewerA:IViewer
{
#region IViewer 成员
/// <summary>
/// 接收者A
/// </summary>
/// <param name="inform"></param>
public void Update(Inform inform)
{
Console.WriteLine(
string.Format("{0},快跑!", inform.State));
}

#endregion
}

public class ViewerB : IViewer
{
#region IViewer 成员
/// <summary>
/// 接收者B
/// </summary>
/// <param name="inform"></param>
public void Update(Inform inform)
{
Console.WriteLine(
string.Format("{0},快打!", inform.State));
}

#endregion
}
posted @ 2011-05-11 11:49  CNF  阅读(202)  评论(0编辑  收藏  举报