C#设计模式 - 观察者模式(使用委托)

1.概念

     观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

2.角色

      2.1 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

  2.2 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。

  2.3 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

  2.4 具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

3.具体实现之委托实现。

  模拟的场景:猫叫了,老鼠跑了、主人醒了。

     3.1 ISubject 抽象

    public delegate void NotifyHandler();
public abstract class ISubject { public event NotifyHandler NotifyEvent; protected void Notify() { if (NotifyEvent != null) NotifyEvent(); } public virtual void Run() { } }

     3.2 CatSubject

   public class CatSubject : ISubject
    {
        public override void Run()
        {
            Console.WriteLine("猫叫了...");
            this.Notify();
        }
    }

      3.3 Observer

  public abstract class Observer
    {
        protected Observer(ISubject sub)
        {
            sub.NotifyEvent += Response;
        }

        public abstract void Response();
    }

      3.4 MouseObserver

  public class MouseObserver : Observer
    {
        public MouseObserver(ISubject sub)
            : base(sub)
        {

        }
        public override void Response()
        {
            Console.WriteLine("老鼠跑了!");
        }
    }

      3.5 MasterObserver

public class Master2Observer : Observer
    {
        public Master2Observer(ISubject sub):base(sub)
        {
            
        }
        public override void Response()
        {
            Console.WriteLine("主人醒了....");
        }
    }

      3.6 调用

var sub = new CatSubject();
var mouse = new MouseObserver(sub);
var master = new Master2Observer(sub);
sub.Run(); 

      3.7 结果

    

posted @ 2015-07-21 09:38  b̶i̶n̶g̶.̶  阅读(1291)  评论(1编辑  收藏  举报