观察者模式读书笔记

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某个主题对象(subjec),这个主题对象在状态发生变化时,会通知所有观察者对象。

使他可以自动更新自己。

  • 当一个对象改变的时候需要同时改变其他的对象。
  • 它不知道具体有多少对象有待改变,应该使用observer模式
  • 一个抽象模型有两个方面,其中一个方面依赖于另外一个方面。这是用观察者模式可以将这两者封装在独立的对象中使他们可以独立的改变和复用。
  • 观察者做的事情就是在解除耦合。这是依赖倒转

//这里是入口函数 

class Program
    {
        static void Main(string[] args)
        {
            ConcreateSubjec s = new ConcreateSubjec();
            s.Attach(new ConcreateObserver(s,"X"));
            s.Attach(new ConcreateObserver(s, "Y"));
            s.Subjectstate = "我回来了!";
            s.Noticy();
            Console.Read();
        }
    }

using System;
using System.Collections.Generic;
using System.Text;
namespace Observer2
{
    abstract  class Subject  //抽象通知者,或者主题
    {
        private IList<Observer> observers = new List<Observer>(); //实现泛型
        //增加观察者
        public void Attach(Observer obs)
        {
            observers.Add(obs);
        }
        //减少观察者
        public void Detach(Observer obs)
        {
            observers.Remove(obs);
        }
        //开始通知
        public void Noticy()
        {
            foreach (Observer o in observers)
            {
                //通知
                o.Update(); //这是抽象观察者的更新方法
            }
        }
    }
    //abstract class Observer //观察者
    //{
    //    public abstract void Update(); //实现一个抽象的更新方法
    //}
    //上面的代码应该用接口实现
    interface Observer
    {
        void Update();
    }
    class ConcreateSubjec : Subject  //具体通知者
    {
        private string _Subjectstate; //实现具体观察者的状态
        public string Subjectstate
        {
            get { return _Subjectstate; }
            set { _Subjectstate = value; }
        }
    }
    class ConcreateObserver : Observer //具体的观察者
    {
        private string name;           //具体观察者
        private string observerstatus; //观察者的状态
        private ConcreateSubjec  sb;//实现具体的通知者 这里难道不是强耦合关系呢?????
        public ConcreateObserver(ConcreateSubjec sb, string name) //这里构造函数依赖具体的观察者
        {
            this.name = name;
            this.sb = sb;
        }
       // public override void Update() //override抽象函数
        public void Update() //用接口以后就不可以用override了
        {
            observerstatus = sb.Subjectstate;
            Console.WriteLine("观察者{0}的状态是:{1}", name, observerstatus);
        }
        public ConcreateSubjec sb2  //这个是用来做什么的?
        {
            get { return sb2; }
            set { sb2 = value; }
        }
    }
}

posted @ 2008-01-03 21:09  乱草  阅读(206)  评论(0)    收藏  举报