概述:

观察者模式 有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式。 举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。


实现方式:
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动执行相应动作。
那么这里就有两个角色,被观察者(Observable)和观察者(Observer)。
被观察者:包含一个观察者的容器,注册和注销观察者的方法,还有通知观察者的方法。
观察者:包含一个收到通知后执行的方法。
以上只是一个最基本的观察者模式的代码设计框架,往往实际运用时需要扩展。另外,在实际运用中,常常结合监听器等来实现观察者模式,如Spring的各种Listener。
下面我们来看一种最基本的观察者模式的代码实现:
被观察者抽象类(Observable)
public abstract class Observable {private final ArrayList<Observer> observers = new ArrayList<Observer>();private final Object lock = new Object();/*** 注册观察者* @param observer   观察者实例*/public void registerObserver(Observer observer) {if(observer == null) throw new NullPointerException("Null Observer" );// 这里的同步是防止多线程同时对同一个观察者实例进行注册synchronized (lock ) {if(!observers .contains(observer))observers.add(observer );}}/*** 注销观察者* @param observer*/public void unRegisterObserver(Observer observer){observers.remove(observer );}/*** 通知观察者*/public void notifyObservers() {for(Observer obj : observers ) {obj.update();}}
}

观察者接口(Observer):
public interface Observer {public void update();
}

被观察者具体类(ConcreteObservable):
public class ConcreteObservable extends Observable {// 这里没有重写父类的方法,有需要可重写
}

观察者具体类(ConcreteObserver):

public class ConcreteObserver implements Observer {private String name ;public ConcreteObserver(String name ) {this.name = name ;}@Overridepublic void update() {System. out.println(name + " update!!!" );}
}

测试代码:
public static void main(String[] args) {ConcreteObservable subject = new ConcreteObservable();ConcreteObserver observer1 = new ConcreteObserver("observer1");ConcreteObserver observer2 = new ConcreteObserver("observer2");ConcreteObserver observer3 = new ConcreteObserver("observer3");subject.registerObserver( observer1);subject.registerObserver( observer2);subject.registerObserver( observer3);subject.notifyObservers();
}


使用场景:
一般符合以下场景条件的场景即可使用观察者模式: 
  1. 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
  2. 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。


注意事项:

在应用观察者模式编写代码的时候,应该基于接口编程,而不是具体类,这样可以为程序提供更大的灵活性。意思就是被观察者和观察者之间不需要知道彼此的具体类型,如本文例子,只需要确认被观察是继承自Obervable,观察者是实现了Oberver接口即可。

转载于:https://www.cnblogs.com/ViviChan/p/4981715.html

设计模式-观察者模式相关推荐

  1. Python设计模式-观察者模式

    Python设计模式-观察者模式 代码基于3.5.2,代码如下; #coding:utf-8 # 观察者设计模式class observerInterface():def update(self,va ...

  2. [Head First设计模式]山西面馆中的设计模式——观察者模式

    原文:[Head First设计模式]山西面馆中的设计模式--观察者模式 系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也 ...

  3. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  4. 【学习笔记】ABAP OOD设计模式 - 观察者模式

    ABAP OOD设计模式 - 观察者模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,这个对象相关依赖的 ...

  5. Java设计模式-观察者模式(订阅发布模式)

    Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...

  6. 设计模式---观察者模式介绍与理解

    设计模式---观察者模式介绍与理解: 观察者模式原理:类似于定牛奶业务 1. 奶站,subject:登记注册,移除,通知(register,remove,notify) 2. 用户,observer: ...

  7. 设计模式-观察者模式 发布/订阅模式

    设计模式-观察者模式 发布/订阅模式 代码 观察者接口 public interface IHanFeiZi{// 当吃早饭时public void havBreakFast();// 进行娱乐活动时 ...

  8. 设计模式 | 观察者模式及典型应用

    本文主要内容: 介绍观察者模式 微信公众号的发布/订阅示例 观察者模式总结 分析观察者模式的典型应用 JDK 提供的观察者接口中的观察者模式 Guava EventBus 中的观察者模式 JDK 委托 ...

  9. 李建忠设计模式——观察者模式

    1.观察者模式(Observer/Event) 1.动机 在软件构建过程中,需要为某些对象建立一种"通知依赖关系"--一个对象(目标)的状态发生改变,所有的依赖对象(观察者对象)都 ...

  10. 设计模式●观察者模式

    设计模式●观察者模式 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做发布-订阅( ...

最新文章

  1. spring整合webservice
  2. Qt 从C ++定义QML类型(二)
  3. 紫书 习题 10-7 UVa 10539(long long + 素数筛)
  4. RabbitMQ(2) 一般介绍
  5. python教学视频q_#python如何用pyqt5打开视频(还有PPT)并输出到QLabel上?#python怎么运行视屏教程...
  6. 新Attention | NAM,一种新的注意力计算方式,无需额外的参数
  7. PL\SQL设置中文
  8. 由于没有公钥,无法验证下列签名
  9. 彻底解决pip下载pytorch慢的问题
  10. php gtk 中文手册,PHP-GTK
  11. 记一次Exception in thread main java.lang.NullPointerException异常
  12. 齐齐哈尔鹤城计算机学校,齐齐哈尔市鹤城高级中学
  13. 视频网站套上CDN是什么效果?
  14. java web inf_JavaWeb - 访问 WEB-INF 资源几种方式
  15. 点集拓扑学的历史介绍
  16. vsCode在window电脑中安装FiraCode字体(好看字体)
  17. IBM PC机是一台什么计算机,PC机是什么类型的计算机
  18. SpringBoot-事务应用场景和隔离级别与传播行为
  19. 13.矩阵的快速转置算法
  20. Linux:刚创建的普通用户不能使用Tab和上下左右键

热门文章

  1. Apache访问日志详解
  2. OraOps10.dll不能加载
  3. redis未能启动服务器,redis服务启动不了的解决办法(服务器应非法关机了)
  4. zabbix监控linux网卡流量,Zabbix结合iptables监控网络流量
  5. byte数组截取_Go解密:数组、切片
  6. 这八个步骤,Python让你轻松爬取B站弹幕,网友看了都说6
  7. 【python教程入门学习】利用Python绘制关系网络图
  8. 关于学习Python的一点学习总结(56->random的使用)
  9. 图论 ---- 图论构造成二分图去判断 F. Figure Fixing
  10. python评委打分代码_STL案例—评委打分