/**/
/// <summary>
/// 在Observer Pattern(观察者模式)中,此类作为所有Subject(目标)的抽象基类
/// 所有要充当Subject的类(在此事例中为"猫")都继承于此类.
/// 我们说此类作为模型,用于规划目标(即发布方)所产生的事件,及提供触发
/// 事件的方法.
/// 此抽象类无抽象方法,主要是为了不能实例化该类对象,确保模式完整性.
/// 具体实施:
/// 1.声明委托
/// 2.声明委托类型事件
/// 3.提供触发事件的方法
/// </summary>
public abstract class ModelBase
{
public ModelBase()
{
}
/// <summary>
/// 声明一个委托,用于代理一系列"无返回"及"不带参"的自定义方法
/// </summary>
public delegate void SubEventHandler();
/// <summary>
/// 声明一个绑定于上行所定义的委托的事件
/// </summary>
public event SubEventHandler SubEvent;
/// <summary>
///封装了触发事件的方法
///主要为了规范化及安全性,除观察者基类外,其派生类不直接触发委托事件
/// </summary>
protected void Notify()
{
if (this.SubEvent != null)
{
this.SubEvent();
}
}
}
public abstract class Observer
{
/**/
/// <summary>
/// 构造时通过传入模型对象,把观察者与模型关联,并完成订阅.
/// 在此确定需要观察的模型对象.
/// </summary>
/// <param name="childModel">需要观察的对象</param>
public Observer(ModelBase childModel)
{
//订阅
//把观察者行为(这里是Response)注册于委托事件
childModel.SubEvent += new ModelBase.SubEventHandler(Response);
}
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("cat cry:");
this.Notify();
}
}
public class Mouse : Observer
{
public string Name { get; set; }
public Mouse(string name, ModelBase childModelBase)
: base(childModelBase)
{
Name = name;
}
public override void Response()
{
Console.WriteLine(string.Format("{0} running!",this.Name));
}
}
public class Children : Observer2
{
public string Name { get; set; }
public Children(string name, ModelBase childModelBase) : base(childModelBase)
{
Name = name;
}
public override void Response1()
{
Console.WriteLine(string.Format("{0} weak!", this.Name));
}
public override void Response2()
{
Console.WriteLine(string.Format("{0} cry!", this.Name));
}
}
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse=new Mouse("mouse",cat);
Children cl=new Children("baby",cat);
cat.Cry();
Console.ReadKey();
}
}