<span style="color: rgb(51, 51, 51); font-family: arial, sans-serif; font-size: 14px; line-height: 24px; text-indent: 28px;">观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现--这一点为程序提供了更大的灵活性。</span>
namespace Demo1
{
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat(); //被观察的对象
Mouse mouse = new Mouse("老鼠",cat);
Master master = new Master("主人",cat);
Baby baby = new Baby("宝贝",cat);
cat.Cry();
Console.Read();
}
}
public abstract class ModelBase //在Observer Pattern(观察者模式)中,此类作为所有Subject(目标)的抽象基类
{
public ModelBase()
{
}
public delegate void SubEventHandler();
public event SubEventHandler SubEvent;
/// <summary>
/// 封装了触发事件的方法
/// 主要为了规范化及安全性,除观察者基类外,其派生类不直接触发委托事件
/// </summary>
protected void Notify()
{
//提高执行效率及安全性
if(this.SubEvent!=null)
this.SubEvent();
}
}
public abstract class Observer //在Observer Pattern(观察者模式)中,此类作为所有Observer(观察者)的抽象基类
{
/// 构造时通过传入模型对象,把观察者与模型关联,并完成订阅.
/// 在此确定需要观察的模型对象.
/// </summary>
/// <param name="childModel">需要观察的对象</param>
public Observer(ModelBase childModel)
{
//订阅,把观察者行为(这里是Response)注册于委托事件
childModel.SubEvent+=new ModelBase.SubEventHandler(Response);
}
/// <summary>
/// 规划了观察者的一种行为(方法),所有派生于该观察者基类的具体观察者都
/// 通过覆盖该方法来实现作出响应的行为.
/// </summary>
public abstract void Response();
}
public abstract class Observer2 //同样是观察者,只是比上面多了一种方法
{
public Observer2(ModelBase childModel)
{
childModel.SubEvent += new ModelBase.SubEventHandler(Response1);
childModel.SubEvent += new ModelBase.SubEventHandler(Response2);
}
public abstract void Response1();
public abstract void Response2();
}
public class Cat : ModelBase //被观察的对象
{
public Cat()
{
}
//定义一个行为,猫大叫
public void Cry()
{
Console.WriteLine("猫大叫");
this.Notify(); //调用基类的方法,触发事件
}
}
public class Mouse : Observer //观察者,老鼠
{
private string _name;
public Mouse(string name,ModelBase childModel):base(childModel)
{
//初始化字段,老鼠的名字
this._name = name;
}
//覆盖基类方法
public override void Response()
{
Console.WriteLine("老鼠赶快逃跑");
}
}
public class Master : Observer //观察者,主人
{
private string _name;
public Master(string name,ModelBase childModel):base(childModel)
{
this._name = name;
}
public override void Response()
{
Console.WriteLine("主人醒了!");
}
}
public class Baby : Observer2 //观察者,Baby
{
private string _name;
public Baby(string name,ModelBase childModel):base(childModel)
{
this._name = name;
}
public override void Response1()
{
Console.WriteLine("宝贝醒了");
}
public override void Response2()
{
Console.WriteLine("宝贝开始哭啦");
}
}
}