笔记-大话设计模式-14 观察者模式

观察者模式又叫做发布-订阅(Publish/Subscribe)模式。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

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

Demo1:

    interface Subject
    {
        void Attach(Observer observer);
        void Detach(Observer observer);
        void Notify();
        string SubjectState
        {
            set;
            get;
        }
    }
    abstract class Observer
    {
        protected string name;
        protected Subject subject;

        public Observer(string name, Subject subject)
        {
            this.name = name;
            this.subject = subject;
        }

        public abstract void Update();
    }
    class StockObserver : Observer
    {
        public StockObserver(string name, Subject subject)
            : base(name, subject)
        {

        }

        public override void Update()
        {
            Console.WriteLine("{0} {1} 关闭股票行情,继续工作!", subject.SubjectState, name);
        }
    }
    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 (var item in observers)
            {
                item.Update();
            }
        }

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

Test:

            Subject boss = new Boss();
            Observer p1 = new StockObserver("Jack", boss);
            boss.Attach(p1);
            boss.SubjectState = "老板回来了";
            boss.Notify();

Demo2(improvement version):

    interface Subject2
    {
        //void Attach(Observer observer);
        //void Detach(Observer observer);
        void Notify();
        string SubjectState
        {
            set;
            get;
        }
    }
    class Boss2 : Subject2
    {
        //private IList<Observer> observers = new List<Observer>();
        private string action;
        public event Action Update;
        //public void Attach(Observer observer)
        //{
        //    observers.Add(observer);
        //}

        //public void Detach(Observer observer)
        //{
        //    observers.Remove(observer);
        //}

        public void Notify()
        {
            //foreach (var item in observers)
            //{
            //    item.Update();
            //}
            Update();
        }

        public string SubjectState
        {
            get
            {
                return action;
            }
            set
            {
                action = value;
            }
        }
    }
    class CoderObserver
    {
        private string name;
        private Subject2 subject;
        public CoderObserver(string name, Subject2 subject)
        {
            this.name=name;
            this.subject=subject;
        }

        public void CoderObserverUpdate()
        {
            Console.WriteLine("{0} {1} 程序员,继续写代码!", subject.SubjectState, name);
        }
    }
    class StockObserver2
    {
        private string name;
        private Subject2 subject;
        public StockObserver2(string name, Subject2 subject)
        {
            this.name=name;
            this.subject=subject;
        }

        public void StockObserverUpdate()
        {
            Console.WriteLine("{0} {1} 关闭股票行情,继续工作!", subject.SubjectState, name);
        }
    }

Test:

            Boss2 boss = new Boss2();
            StockObserver2 ob1 = new StockObserver2("Jack", boss);
            CoderObserver co = new CoderObserver("Lei", boss);
            boss.Update += ob1.StockObserverUpdate;
            boss.Update += co.CoderObserverUpdate;
            boss.SubjectState = "老板回来了";
            boss.Notify();
时间: 2024-11-05 16:08:56

笔记-大话设计模式-14 观察者模式的相关文章

大话设计模式_观察者模式(Java代码)

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们自己能够自动更新自己.简单描述:1个Subject类(可以是抽象类可以是接口),可以有多个具体Subject类(继承抽象Subject),此具体Subject持有多个观察者的引用,在此具体Subject状态发生变化的时候调用这些观察者的相应方法.另外,这些持有的引用是抽象的,不是具体的,而这些引用所指向的对象时具体的观察者(即需要作出更新的具体观察者,这些具体

读书笔记-常用设计模式之观察者模式

1.观察者(Observer)模式也叫发布/订阅(Publish/Subscribe)模式,是MVC(模型-视图-控制器)模式的重要组成部分.在软件系统中,一个对象状态改变也会连带影响其他很多对象的状态发生改变.能够实现这一需求且复用性强,对象之间匿名通信的,观察者模式是其中最适合的一个. 2.观察者模式的类图如下: 它有四个角色: 抽象主题(Subject):在Objective-C中,抽象主题是一个协议,它是观察者集合容器,定义了添加观察者(attach)方法.移除观察者(detach)方法

大话设计模式之观察者模式

从前,有个放羊娃.每天都去山上放羊,一天,他认为十分无聊.就想了个捉弄大家寻开心的主意. 他向着山下正在种田的农夫们大声喊:"狼来了!狼来了!救命啊! "农夫们听到喊声急忙拿着锄头和镰刀往山上跑,他们边跑喊:"不要怕,孩子,我们来帮你打恶狼!"农夫们气喘吁吁地赶到山上一看,连狼的影子也没有!放羊娃哈哈大笑:"真有意思,你们上当了! "农夫们生气地走了.第二天,放羊娃故伎重演,善良的农夫们又冲上来帮他打狼,可还是没有见到狼的影子. 放羊娃笑得直不起

设计模式(14)-----观察者模式

观察者模式(Observer) 定义 定义了一种一堆多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. UML类图 成员角色 抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者.抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色. 具体主题(ConcreteSubj

&lt;十&gt;读&lt;&lt;大话设计模式&gt;&gt;之观察者模式

观察者模式也是比较简单的一种模式,可能从名字上理解无法明白,但真正理解其含义之后就非常简单了,说实话在自己来发的项目中自己也用到过,只不过不知道它叫观察者罢了,只要懂面向对象的对继承多态理解很深的,玩观察者模式很随意就能用到项目中去. 这本书用一个很形象的故事解释了观察者模式,故事情景:公司员工当老板不在时有的炒股有的看NBA,为了防止老板偷袭,让前台MM通知.即前台MM充当了观察者,而员工属于具体的实例对象了.我们要编写的代码就是MM作为通知类,员工作为被通知者, 观察者模式:定义了一种一对多

笔记-大话设计模式-18 备忘录模式

备忘录模式(Memento),在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态.Originator可根据需要决定Memento存储Originator的哪些内部状态. Memento(备忘录):负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento

笔记-大话设计模式-19 组合模式

组合模式(Composite),将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. Demo1: abstract class Component { protected string name; public Component(string name) { this.name = name; } public abstract void Add(Component c); public abstract void Remove

笔记-大话设计模式-20 迭代器模式

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. Demo1: abstract class Iterator { public abstract object First(); public abstract object Next(); public abstract bool IsDone(); public abstract object CurrentItem(); } abstract class Aggregate { pub

笔记-大话设计模式-17 适配器模式

适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况. 适配器模式有两种类型:类适配器模式和对象适配器模式. DataAdapter用作DataSet和数据源之间的适配器以便检索和保存数据.DataAdapter通过映射Fill(这更改了DataSet中的数据以便与数据源中的数据相匹配)和Update(这更改了数据源中的