前几天面试碰到了这样一道题,猫大吼一声,屋子里的老鼠全都开始逃跑,屋子的主人同时也被惊醒.用C#实现,当时我不知道如何去解,就写了一句用委托实现,呵呵!回来之后,在网上查了一下,才明白应该使用设计模式中的观察者模式,于是我就自己整理了一下这道题,写在这里,做个记号方便以后用得着的时候看一下.
观察者模式(Oberver)就是一个被观察者和一个或者多个观察者组成!事件,事件委托,做事人为被观察者!监督他们运行和行动并做出自己的响应的人为观察者!
首先建立被观察者的抽象类Subject
namespace Observer_Cat
![]()
![]()
{
![]()
/**//// <summary>
/// 声明委托,委托类型和触发事件的方法
/// 在观察者模式中,此类为Subject(主体)和抽象基类
/// </summary>
public abstract class Subject
![]()
{
public Subject()
![]()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
![]()
public delegate void MyDelegate();//声明一个不带返回类型和参数的委托
![]()
public event MyDelegate MyDelegateEvent;//委托事件
![]()
![]()
/**//// <summary>
/// 封装了触发事件的方面
/// 为程序提供完整性,除观察者以外的所有成员都不能直接调用.
/// </summary>
protected void Notify()
![]()
{
this.MyDelegateEvent();
}
}
}
再接着建立一个观察者的抽象类Observer
namespace Observer_Cat
![]()
![]()
{
![]()
/**//// <summary>
/// 构造函数中,注册事件。
/// 在观察者模式中,此类相当与所有观察者的基类
/// 所有观察者都必须继承此类
/// </summary>
public abstract class Observer
![]()
{
public Observer(Subject subject)
![]()
{
subject.MyDelegateEvent +=new Observer_Cat.Subject.MyDelegate(Hack);
}
![]()
public Observer(Subject subject,string strName)
![]()
{
subject.MyDelegateEvent +=new Observer_Cat.Subject.MyDelegate(Hack);
}
![]()
public abstract void Hack();
}
}
为猫添加一个类继承于Subject添加猫叫的方法
namespace Observer_Cat
![]()
![]()
{
public class Cat:Subject
![]()
{
public Cat()
![]()
{
}
![]()
public void Cry()
![]()
{
Console.WriteLine("猫大吼一声");
this.Notify();
}
}
}
再接者是为老鼠逃走和惊醒主人添加类继承于Observer
namespace Observer_Cat
![]()
![]()
{
public class Mouse:Observer
![]()
{
string str;
public Mouse(Subject subject,string strName):base(subject,strName)
![]()
{
str = strName;
}
![]()
public override void Hack()
![]()
{
Console.WriteLine(str+ "开始逃跑");
}
![]()
}
![]()
public class Master:Observer
![]()
{
public Master(Subject subject):base(subject)
![]()
{}
![]()
public override void Hack()
![]()
{
Console.WriteLine("主要被惊醒");
}
![]()
}
}
最后就是主程序
namespace Observer_Cat
![]()
![]()
{
![]()
/**//// <summary>
/// ThreadMain的摘要说明。
/// </summary>
class ThreadMain
![]()
{
![]()
/**//// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
![]()
{
//
// TODO: 在此处添加代码以启动应用程序
//
Cat cat = new Cat();
Mouse mouse1 = new Mouse(cat,"一只老鼠");
Mouse mouse2 = new Mouse(cat,"二只老鼠");
Master master = new Master(cat);
![]()
cat.Cry();
![]()
Console.ReadLine();
![]()
}
}
}
运行结果:
![]()
这些代码是我参考网上的资源写出来的,有不妥的地方还请各位大侠指正,共同进步.