观察者模式
前几天面试碰到了这样一道题,猫大吼一声,屋子里的老鼠全都开始逃跑,屋子的主人同时也被惊醒.用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();
}
}
}
{
/// <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添加猫叫的方法{
/// <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();
}
}
namespace Observer_Cat
{
public class Cat:Subject
{
public Cat()
{
}
public void Cry()
{
Console.WriteLine("猫大吼一声");
this.Notify();
}
}
}
再接者是为老鼠逃走和惊醒主人添加类继承于Observer{
public class Cat:Subject
{
public Cat()
{
}
public void Cry()
{
Console.WriteLine("猫大吼一声");
this.Notify();
}
}
}
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("主要被惊醒");
}
}
}
最后就是主程序{
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();
}
}
}
运行结果:{
/// <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();
}
}
}
这些代码是我参考网上的资源写出来的,有不妥的地方还请各位大侠指正,共同进步.