设计模式学习笔记——观察者模式

原创 2016年08月29日 16:41:06

1.基本简介

        观察者模式(又被称作发布-订阅模式)是一种软件设计模式,在此模式中,一个目标可以管理所有依赖于它的观察者,当目标本身的状态改变时主动向所有观察者发出通知。

        观察者模式将观察者和被观察的对象分开。面向对象设计的一个原则是单一职责原则,也就是说一个类只负责一种职责。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和可重用性。

2.模式中的角色

        2.1 抽象主题:它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加或者删除观察者对象。

      2.2 具体主题:将有关状态存入具体观察者对象,在具体主题内部状态改变事,给所有注册过的观察者发出通知。

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

      2.4 具体观察者:实现抽象观察者角色所定义的更新接口,已便更改本身的状态

3.观察者模式的代码

    //抽象主题角色
    public interface IDataObservable {

    // 增加观察者
    public void registerDataObserver(IDataObserver dataObserver);
     
    // 移除观察者
    public void unRegisterDataObserver(IDataObserver dataObserver);
    
    // 向观察者(们)发出通知
    public void notifyAllObserver();

    // 观察者(们)收到通知后获取信息
    public Object getObserverData();
    
    }

  

    // 抽象观察者类,为所有具体观察者定义一个接口,在得到通知时更新自己
    public interface IDataObserver {
    
    public void update(IDataObservable dataObservable);
    
    }


    // 具体观察者或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
   public class ConcreteSubject implements IDataObservable
   {
        private List<IDataObserver> mObserver=new ArrayList<IDataObserver>();
        private Object mObject;
    
        @Override
        public void registerDataObserver(IDataObserver dataObserver) {
            mObserverList.add(dataObserver);
        }
    
        @Override
        public void unRegisterDataObserver(IDataObserver dataObserver) {
           mObserver.remove(mObserver);
        }

        @Override
        public void notifyAllObserver() {
         for (IDataObserver observer : (ArrayList<IDataObserver>) mObserverList.clone()) {
                observer.update(this);
         }
        }

        @Override
        public Object getObserverData() {
            return mObject;
        }

    }
    // 具体观察者,实现抽象观察者角色所要求的更新接口,已是本身状态与主题状态相协调
    public class ConcreteObserver implements IDataObserver
    {

      public ConcreteObserver()
      {
       
      }
      // 实现抽象观察者中的更新操作
       @Override
      public void update(IDataObservable dataObservable) {

      }
    }

设计模式(五)观察者模式

观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听莫一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们...
  • itachi85
  • itachi85
  • 2016年03月02日 17:41
  • 40586

Qt信号槽与观察者模式

qt的核心机制:信号与槽和设计模式中的观察者模式很类似。 https://www.devbean.net/2012/08/qt-study-road-2-custom-signal-slot 这篇...
  • u011391629
  • u011391629
  • 2017年03月20日 21:59
  • 1121

设计模式-深入解析观察者模式(Observer)

在上篇设计模式上我们继续前进把,苦逼(酷毙)的程序员一刻都不能松懈的,要紧跟脚步,每天都学习啊!!学了策略模式,我自己去用设计模式写了几个例子,感觉还扣以啊。下面继续总结一下观察者模式的学习,如有不正...
  • qq_29282475
  • qq_29282475
  • 2015年12月07日 16:16
  • 1325

Java设计模式-回调函数和观察者模式

Android的框架中有非常多的地方使用了回调的模式,例如Activity的生命周期,按钮的点击事件等。 下面是回调的基本模型: public class A { private CallBack...
  • cauchyweierstrass
  • cauchyweierstrass
  • 2015年03月24日 16:20
  • 8993

回调函数升级版-设计模式(观察者模式)

书接上回,上一周大体写了一下回调函数的使用,这周我就大体说一下设计模式中的观察者模式。我自己认为观察模式就是回调函数的升级版,在用法上。废话少说,直接上图。 这是我正在弄的一个应用,画面有点模仿荔枝...
  • liujianshui
  • liujianshui
  • 2015年07月07日 14:32
  • 790

PHP设计模式之观察者模式(Observer)详细介绍和代码实例

【意图】 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新【GOF95】 又称为发布-订阅(Publish-Subscribe)模式、模型-视图...
  • longjef
  • longjef
  • 2016年11月02日 09:51
  • 3757

Unity设计模式:观察者模式

初学编程的时候内容比较少没有数据交互,等内容多到需要多个文件多个类协同运行的时候就涉及到类之间的数据交互了。比较简单的数据交互是这些类之间互相引用,直接或间接传值或调用,但是这样类之间的耦合性太高了,...
  • ylbs110
  • ylbs110
  • 2016年12月31日 08:36
  • 551

设计模式——观察者模式(Observer)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记,欢迎交流。 ——Shulin 转载请注明出处:http://blog.csdn.net/zhsh...
  • u012909091
  • u012909091
  • 2014年08月20日 16:52
  • 2964

.NET中的设计模式五:观察者模式

 观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的...
  • mydriverc
  • mydriverc
  • 2007年05月30日 13:47
  • 577

设计模式之观察者模式(气象站案例)

气象监测的应用概况三个部分: 气象站:获取气象数据的物理装置。 WeatherData对象:a.获取来自气象站的数据. b.更新布告板. 布告板:显示天气状况.WeatherData对象中含有的...
  • qq_38262266
  • qq_38262266
  • 2017年05月09日 18:42
  • 213
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式学习笔记——观察者模式
举报原因:
原因补充:

(最多只允许输入30个字)