观察者模式(一)

1 观察者模式(Observer Mode)定义
c#

    观察者模式又叫作发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化使,会通知全部观察者对象,使他们可以自动更新本身.
ide

2 观察者模式组成this

  •     Subject类spa

    主题或抽象通知者,通常用一个抽象类或者一个接口实现.它把全部对观察者对象的引用保存在一个汇集里,每一个主题均可以有任何数量的观察者.抽象主题提供一个接口,能够增长和删除观察者对象.示例代码以下:
code

abstract class Subject
    {
        private IList<Observer> observers = new List<Observer>();

        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();
            }
        }
    }

  •     Observer类
    server

    抽象观察者,为全部的具体观察者定义一个接口,在获得主题的通知时更新本身.这个接口叫作更新接口.抽象观察者通常用一个抽象类或者一个接口实现.更新接口一般包含一个Update()方法,这个方法叫作更新方法.示例代码以下:对象

 abstract class Observer
    {
        public abstract void Update();
    }

  •     ConcreteSubject类
    接口

    具体主题或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给全部登记过的观察者发出通知.具体主题角色一般用一个具体子类实现.示例代码以下:
get

class ConcreteSubject:Subject
    {
        private string subjectState;

        public string SubjectState
        {
            get { return subjectState; }
            set { subjectState = value; }
        }
    }

  •     ConcreteObserver类
    string

    具体观察者,实现抽象观察者角色所要求的更新接口,以便使自己的状态与主题的状态相协调.具体观察者角色能够保存一个指向具体主题对象的引用.具体观察者角色一般用一个具体子类实现.示例代码以下:

class ConcreteObserver:Observer
    {
        private string name;
        private string observerState;
        private ConcreteSubject subject;

        public ConcreteObserver(ConcreteSubject subject, string name)
        {
            this.subject = subject;
            this.name = name;
        }

        public override void Update()
        {
            observerState = subject.SubjectState;
            Console.WriteLine("觀察者{0}的新狀態是{1}", name, observerState);
        }

        public ConcreteSubject Subject
        {
            get { return subject;}
            set{subject=value;}
        }
    }

    客户端代码以下所示:

 static void Main(string[] args)
        {
            ConcreteSubject s = new ConcreteSubject();

            s.Attach(new ConcreteObserver(s, "X"));
            s.Attach(new ConcreteObserver(s, "Y"));
            s.Attach(new ConcreteObserver(s, "Z"));

            s.SubjectState = "ABC";
            s.Notify();

            Console.Read();
        }

    

    结果显示:

    观察者X的新状态是ABC

     观察者Y的新状态是ABC

     观察者Z的新状态是ABC

3 观察者模式特色

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

相关文章
相关标签/搜索