观察者模式:

  已一对多的方式,通过制定一个主题,使多个不同的订阅者能时时的接收到最新的消息。

  注意.观察者模式的通知次序是不被依赖的,若你需要明确通知次序或者对通知的顺序有强烈的要求那么请酌情使用该模式。

定义一个主题:

主题中处理基本的添加/删除 订阅者  消息发布 还加入一个change锁  可以负责消息发布的控制,将灵活的控制消息的发布,减少不必要的消息传播。

消息的发布主要是依靠接口的特性传播,通过实现一个订阅者接口来设定订阅者,主题不需要具体的订阅者是谁,只需要在消息更新时对这个接口的所有实现发布即可。

public interface Subjects {void add(Object obj);void remove(Object obj);void notifyObserver();void setMessage(String msg);void setChange();}

View Code

public class Subject implements Subjects{private ArrayList<Object> observers;private String message;private boolean lock;public Subject() {observers = new ArrayList<>();}@Overridepublic void add(Object obj) {observers.add(obj);}@Overridepublic void remove(Object obj) {int i = observers.indexOf(obj);if (i > 0) {observers.remove(obj);}}@Overridepublic void notifyObserver() {if (lock) {for (int i = 0; i < observers.size(); i++) {Observers observer = (Observers)observers.get(i);observer.update(message);}lock = false;}}public void change() {setChange();notifyObserver();}@Overridepublic void setMessage(String msg) {this.message = msg;change();}@Overridepublic void setChange() {lock = true;}
}

View Code

订阅者

 主题消息的发布与订阅者之间有个共同的方法,通过这个方法订阅者来接受发布出来的消息。 单纯的实现订阅接口但是不重写方法而是自己编写另一个方法就无法实现消息的接收了。

public interface Observers {public void update (String message);
}

 

public class Observer implements Observers{public Observer(Subject s) {s.add(this);}//被动订阅
    @Overridepublic void update(String message) {System.out.println("订阅主题发布的消息:" + message);}//主动拉取//像固定的主题索取消息public void updateActive(Subjects sb) {if (sb instanceof Subject) {System.out.println("订阅者主动向主题拉取数据");}}}

View Code

  

另外java提供了Observer和Observable现成的api可供我们直接使用,setchange的想法也是参考这api的。

虽然说java提供了线程的api类供我们直接使用,但是java提供的observable 是一个实体类 并不是接口,设计原则是针对接口变成,但是java提供的实体类破坏了这个原则。

并且java无法实现多重继承,这样就导致一个子类想公用observable的功能和其他某些超类的功能是就会出现冲突,必须要舍弃一部分。所以通过自己开发的接口可以大大提高灵活度。

而且通过上诉代码应该能自己体验整个流程。所以在正真学会这个模式之后还是推荐自己编写,这样不管是拓展还是修改都很方便!!!

转载于:https://www.cnblogs.com/culushitai/p/8487047.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. Android Studio Day03-1(Android studio 系统界面简介)
  2. session的常用方法。
  3. 使用hibernate实现树形结构无限级分类
  4. free -m linux,linux中free -m 中的一些解释
  5. 【NLP】FedNLP: 首个联邦学习赋能NLP的开源框架,NLP迈向分布式新时代
  6. [TCP/IP] TCP如何保证可靠性
  7. 最小错误率贝叶斯决策
  8. Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源
  9. [js] 解释下深度优先遍历和广度优先遍历的区别及如何实现
  10. python管理系统web版_【程序源代码】python web 管理系统开发框架
  11. 练习-用户模块-注册与登陆 190907
  12. 02:同行列对角线的格子
  13. 真强啊!建议每一个打算学Java的人都来看看!
  14. C语言之10/16进制字符串和数字转换(四)
  15. The content of the adapter has changed but ListView did not receive a notification
  16. 读 《.Net 之美》解析.Net Remoting (应用程序域)-- Part.1
  17. html5 shiv
  18. 路由及路由器工作原理深入解析3:路由与端口
  19. 开源网络情报系统释放数据黄金价值
  20. STM32之USART-串口通信(含串口实验详细解析)

热门文章

  1. 发表的原创文章还希望大家多提宝贵意见!
  2. 硬盘和显卡的访问与控制(一)——《x86汇编语言:从实模式到保护模式》读书笔记01
  3. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
  4. html form表单提交数据并后台获取
  5. Yacc 与 Lex 快速入门(词法分析和语法分析)
  6. Arduino 控制舵机
  7. 设计模式:访问者模式(Visitor Pattern)
  8. java batch批量
  9. 02 面向对象之:类空间问题以及类之间的关系
  10. Refuses to install for WTP10