现在的位置: 首页 > 综合 > 正文

【大话设计模式系列】之观察者模式

2013年12月13日 ⁄ 综合 ⁄ 共 1960字 ⁄ 字号 评论关闭


观察者模式/发布-订阅模式Publish Subscribe 模式 

      定义了一种一对多的依赖的关系,让多个观察者看对象,同时监听某一个主体对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新。

优点:观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响到另外一边的变化. 

当一个对象的改变需要同时改变其他对象时,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式. 

故事情节描述:同事小猪和同事小马趁老板出差的时候,正在查看股市行情,并告诉前台的童子喆“如果老板回来的话,记得通知我们呀!”恰巧,老板忘记带东西,于是推门而入,前台通知同事“老板回来了,关闭股市行情,继续工作!”

//通知者接口
    interface Subject
    {
        void Attach(Observer observer);
        void Detch(Observer observer);
        void Notify();
        String SubjectState
        {
            get;
            set;
        }
    }
	
//具体的通知者类可能是前台,也可能是老板
//它们也许有自己的实现方法,但是对于通知者而言,它们都是一样的,所以他们都去实现这个接口。
    class Boss:Subject 
    {
        //同事列表
        private IList <Observer> observers=new List <Observer>();
        private string action;

        //增加
        public void Attach(Observer observer)
        {
            observers.Add(observer );
        }
        //减少
        public void Detach(Observer observer)
        {
            observers.Remove(observer );
        }
        //通知
       public   void Notify()
        {
            foreach(Observer o in observers )
            o.Update();
        }
        //老板状态
        public string SubjectState
        {
            get {return action ;}
            set {action=value; }
        }
		
//前台秘书类和老板类类似	
 class Secretary : Subject 
    { 
        //同事列表
        private IList <Observer >observers=new List <Observer >();
        private string action;
        //增加
        public void Attach(Observer observer)
        {
            observers.Add(observer );
        }
        //减少
        public void Detach(Observer observer)
        {
            observers.Remove(observer );
        }
        //通知
        public void Notify()
        {
            foreach(Observer o in observers )
            o.Update();
        }
        //老板状态
        public string SubjectState
        {
            get { return action ;}
            set { action=value; }
        }
    }
	
//抽象观察者
    abstract class Observer
    {
        protected string name;
        protected Subject sub;
		
        //抽象通知者类
        public Observer(string name, Subject sub)
        {
            this.name = name;
            this.sub = sub;
        }
        public abstract void Update();
    }
	
//看股票的同事
    class StockObserver:Observer 
    {
        //抽象通知者
        public StockObserver(string name, Subject sub)
            : base(name, sub)
        { }
        //抽象通知者状态
        public override void Update()
        {
            Console.WriteLine("{0}{1}关闭股票行情,继续工作!",sub.SubjectState,name);
        }

    }
//客户端代码
	//老板胡汉三
	Boss huhansan = new Boss();
	//看股票的同事
	StockObserver tongshi1 = new StockObserver("小猪",huhansan );
	//看股票的同事
	StockObserver tongshi2 = new StockObserver("小马",huhansan );

	huhansan.Attach(tongshi1);
	huhansan.Attach(tongshi2 );

	//小马其实是没有被老板通知到的, 所以减去
	huhansan.Detach(tongshi2 );

	//老板回来
	huhansan.SubjectState = "我胡汉三回来了!";
	//发出通知
	huhansan.Notify();
        


抱歉!评论已关闭.