(8)观察者模式

Obsever

观察者模式定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们自动更新自己。

 

 

抽象主题角色:把所有对观察者对象的引用保存在 一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。

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

具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。

具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。通常用一个子类实现

 

 

ISubject.cs(抽象通知者)

    /// <summary>
    /// 通知者接口
    /// </summary>
    interface ISubject
    {
        void Attch(Observer observer);
        void Detach(Observer observer);
        void NotifyObserver();
        string SubjectState { get; set; }
    } 

Secretary.cs (具体通知者)

    /// <summary>
    /// 秘书类
    /// </summary>
    class Secretary : ISubject
    {
        //同事列表
        private IList<Observer> observers = new List<Observer>();

        private string _action;
        //增加
        public void Attch(Observer observer)
        {
            observers.Add(observer);
        }

        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }
        //通知
        public void NotifyObserver()
        {
            foreach (Observer item in observers)
            {
                item.Update();
            }
        }
        //前台状态
        public string SubjectState
        {
            get { return _action; }
            set { _action = value; }
        }
    } 

 

Observer.cs (抽象观察者)

    abstract class Observer
    {
        public string _name;
        public ISubject _sub;

        public Observer(string name, ISubject sub)
        {
            this._name = name;
            this._sub = sub;
        }

        public abstract void Update();
    } 

ConcreteObserver.cs(具体)

    /// <summary>
    /// 股票的观察者
    /// </summary>
    class StockObserver : Observer
    {
        public StockObserver(string name, ISubject sub)
            : base(name, sub)
        {
        }

        public override void Update()
        {
            Console.WriteLine("{0} {1} 关闭股票行情,继续工作!", this._sub.SubjectState, this._name);
        }
    }


    /// <summary>
    /// 看NBA的观察者
    /// </summary>
    class NBAObserver : Observer
    {
        public NBAObserver(string name, ISubject sub) : base(name, sub) { }

        public override void Update()
        {
            Console.WriteLine("{0} {1} 关闭NBA直播,继续工作!", _sub.SubjectState, _name);
        }
    } 

 

客户端代码

        static void Main(string[] args)
        {
            //前台童子喆
            Secretary tongzizhe = new Secretary();
            //看股票的同事
            StockObserver observer1 = new StockObserver("张三", tongzizhe);
            NBAObserver observer2 = new NBAObserver("李四", tongzizhe);
            
            //前台记下了两位同事
            tongzizhe.Attch(observer1);
            tongzizhe.Attch(observer2);

            //张三没通知到
            tongzizhe.Detach(observer1);

            //发现老板回来
            tongzizhe.SubjectState = "老板回来了";
            tongzizhe.NotifyObserver();
            Console.Read();
        } 

 

 

 

  • 1个具体通知者(ConcreteSubject)对应0到N个抽象观察者(Observer)
  • 抽象通知者包含抽象观察者
  • 具体观察者包含抽象通知者

 

 

 

 

 

 

来自为知笔记(Wiz)

时间: 2024-10-18 05:11:27

(8)观察者模式的相关文章

观察者模式

观察者模式:一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现. 观察者 (Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(List)里. 被观察者 被观察对象(Subject)发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者. 代码实例: //被观察者接口 public interface Subject { void add(Observer observer

ExtJS要利用观察者模式 去实现自定义的事件

1 // 要利用观察者模式 去实现自定义的事件 2 3 4 //1:由于浏览器他自己能定义内置的事件(click/blur...) 5 // 我们也应该有一个类似于浏览器这样的类,这个类 自己去内部定义一些事件(自定义事件) 6 var Observable = function(){ 7 //承装自己所定义的事件类型的 8 this.events = ['start','stop']; 9 //我们应该设计一种数据类型,这种数据类型就可以去维护自定义事件类型 和 和相关绑定函数的关系,结构如下

【非凡程序员】 OC第十五节课 (观察者模式和KVO进行对比)

今天主要学了观察者模式,以及回顾复习了KVO,两者进行对比 什么是观察者模式? 我们先打个比方,这就像你订报纸.比如你想知道美国最近放生了些新闻,你可能会订阅一份美国周刊,然后一旦美国有了新的故事,美国周刊就发一刊,并邮寄给你,当你收到这份报刊,然后你就能够了解美国最新的动态.其实这就是观察者模式,A对B的变化感兴趣,就注册为B的观察者,当B发生变化时通知A,告知B发生了变化.这是一种非常典型的观察者的用法,我把这种使用方法叫做经典观察者模式 KVO的全称是Key-Value Observer,

php实现观察者模式

<meta charset='utf-8' /> <title>观察者模式</title> <?php class Tongzhi implements SPLSubject { protected $subs = array(); public $username = '我是被观察者'; public function __construct(){ } public function attach(SPLObserver $sub){ $this->sub

浅谈java中内置的观察者模式与动态代理的实现

一.关于观察者模式 1.将观察者与被观察者分离开来,当被观察者发生变化时,将通知所有观察者,观察者会根据这些变化做出对应的处理. 2.jdk里已经提供对应的Observer接口(观察者接口)与Observable(被观察者类)用于实现观察者模式 3.关于Observer接口,该接口只有一个update方法,当被观察者发生相关变化时,会通知所有的观察者,观察者接受到通知时,调用update方法进行处理.贴出源代码: 1 /* 2 * Copyright (c) 1994, 1998, Oracle

【设计模式】 观察者模式

1.定义 1.1 标准定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),它是一个在项目中经常使用的模式,其定义如下:Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使

《JAVA与模式》之观察者模式

观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观察者模式的结构 一个软件系统里面包含了各种对象,就像一片欣欣向荣的森林充满了各种生物一样.在一片森林中,各种生物彼此依赖和约束

设计模式之二:观察者模式(Observer Pattern)

先看下观察者模式的定义: The Observer Pattern defines a one-to-many denpendency between objects so that when one object changes state, all of its dependents are notified and updated automatically.:观察者模式定义了对象间一对多依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新. 观察者模式又叫发布-

设计模式之观察者模式

观察者模式又称发布-订阅模式,是一种行为型模式.在此种模式中,一个目标物件管理所有相依于它的观察者物件, 并且在它本身的状态改变时主动发出通知.这种模式通常用来实现事件处理系统. 观察者模式完美的将观察者和被观察的对象分离开,在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性. 观察者模式定义了对象间的一种一对多的依赖关系,以便一个对象状态发生变化时,所有依赖于它的对象都得到通知并自动刷新. 实现方式: 观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象.

用java观察者模式解耦经典三层架构

三层架构是一个很经典的架构模式,依据系统的职责不同.将系统分成了表现层,逻辑层和数据訪问层,而且配合数据实体进行传输数据,能够大大的封装性和复用性. 经典的三层架构图: 我们再深入到架构图内部.看看详细的类图,用简单的登陆举例吧: 这里通过LoginUI.调用了LoginLogService和LoginVerificationService两个类.通过类图能够看得出,U层和Service层(本文把BLL层称为了Service层)直接採用了直接调用的方式. 在面向对象的设计中.一直强调要面向接口编