观察者模式介绍:
观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。

简单案例:
假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程

抽象目标类 MySubject
MySubject是抽象目标类,在其中定义了一个ArrayList类型的集合observers,用于存储观察者对象,并定义了注册方法attach()和注销方法detach() ,同时声明了抽象的通知方法 cry()。需要注意的是attach()方法和detach()方法都必须针对抽象观察者进行编程,任何抽象观察者的子类对象都可以注册或注销。

package com.example.designmode.observeprattern;import java.util.ArrayList;
import java.util.List;/*** <h3>design-mode</h3>* <p></p>** @author : ZhangYuJie* @date : 2022-04-24 15:59**/public abstract class MySubject {protected List observers = new ArrayList();/*** 注册方法** @param observer*/public void attach(MyObserver observer) {observers.add(observer);}/*** 注销方法** @param observer*/public void detach(MyObserver observer) {observers.remove(observer);}/*** 抽象通知方法*/public abstract void cry();}

抽象观察者类 MyObserver
抽象观察者MyObserver定义为一个接口,在其中声明了抽象响应方法response()。

package com.example.designmode.observeprattern;/*** <h3>design-mode</h3>* <p></p>** @author : ZhangYuJie* @date : 2022-04-24 16:02**/public interface  MyObserver {/*** 抽象响应方法*/void response();
}

具体目标类 Cat(猫类)
Cat是目标类MySubject 的子类,它实现了抽象方法 cry() ,在cry()中遍历了观察者集合,调用每一个观察者对象的response()响应方法。

package com.example.designmode.observeprattern;/*** <h3>design-mode</h3>* <p></p>** @author : ZhangYuJie* @date : 2022-04-24 16:05**/public class Cat extends MySubject {@Overridepublic void cry() {System.out.println("猫叫!");System.out.println("-----------------------------------------");for (Object obs:observers){((MyObserver)obs).response();}}
}

具体观察者类 Mouse(老鼠类)
Mouse是具体观察者类,它实现了在抽象观察者中定义的响应方法response()。

package com.example.designmode.observeprattern;/*** <h3>design-mode</h3>* <p></p>** @author : ZhangYuJie* @date : 2022-04-24 16:05**/public class Mouse  implements MyObserver {@Overridepublic void response() {System.out.println("老鼠努力逃跑!");}
}

具体观察者类 Dog(狗类)
Dog也是具体观察者类,它实现了在抽象观察者中定义的响应方法response()。

package com.example.designmode.observeprattern;/*** <h3>design-mode</h3>* <p></p>** @author : ZhangYuJie* @date : 2022-04-24 16:05**/public class Dog implements MyObserver {@Overridepublic void response() {System.out.println("狗跟着叫!");}
}

编写客户端类测试
在客户端代码中需要实例化具体目标类和具体观察者类,先调用目标对象的attach()方法来注册观察者,再调用目标对象的cry()方法,在cry()方法的内部将调用观察者对象的响应方法。

package com.example.designmode.observeprattern;/*** <h3>design-mode</h3>* <p></p>** @author : ZhangYuJie* @date : 2022-04-24 16:17**/public class Client {public static void main(String[] args) {MySubject subject=new Cat();MyObserver obs1,obs2,obs3;obs1=new Mouse();obs2=new Mouse();obs3=new Dog();subject.attach(obs1);subject.attach(obs2);subject.attach(obs3);subject.cry();}}


观察者模式很好地体现了面向对象设计原则中的开闭原则。

如果需要增加一个观察者,如猪也作为猫的观察者,但是猫叫猪无须有任何反应,只需要增加一个新的具体观察者类,而对原有的类库无须做任何改动,这对于系统的扩展性和灵活性有很大提高。

新增观察者pig类

package com.example.designmode.observeprattern;/*** <h3>design-mode</h3>* <p></p>** @author : ZhangYuJie* @date : 2022-04-24 16:19**/public class Pig implements MyObserver {@Overridepublic void response() {System.out.println("猪没有反应!");}
}

在客户端代码中可以定义一个Pig实例,再将它注册到目标对象的观察者集合中,则需要增加如下代码:

package com.example.designmode.observeprattern;/*** <h3>design-mode</h3>* <p></p>** @author : ZhangYuJie* @date : 2022-04-24 16:17**/public class Client {public static void main(String[] args) {MySubject subject = new Cat();MyObserver obs1, obs2, obs3, obs4;obs1 = new Mouse();obs2 = new Mouse();obs3 = new Dog();obs4 = new Pig();subject.attach(obs1);subject.attach(obs2);subject.attach(obs3);subject.attach(obs4);subject.cry();}}


总结
观察者模式定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

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

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

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

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

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

  3. java设计模式 观察者模式_理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的"观察者模 ...

  4. JAVA 设计模式 观察者模式

    用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...

  5. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  6. Java设计模式——观察者模式

    转自:http://www.cnblogs.com/shamgod/p/4588557.html 一.概述 childe类中的是关联监听者dad的,若要再增加监听者,会很不方便,且要修改代码.好的方法 ...

  7. Java设计模式——观察者模式与Spring事件监听器

    写在前面的话:终于通读了一遍<Spring源码深度解析>,在Spring的消息发布(Message)模块使用了设计模式中的观察者模式的经典实现,所以趁此机会总结一些. 1. 业务场景 Sp ...

  8. java设计模式---观察者模式

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

  9. JAVA设计模式-观察者模式(Observe)

    观察者模式 其实就是一个发布者和订阅者之间的关系 如果订阅者订阅了发布者,那么发布者发布一条消息,订阅者就会立马知道. 中间的关系也就是订阅者需要去订阅消息(也就是,发布者的通知资源池子(也就是存储订 ...

最新文章

  1. 建房子之前先挖地基 - Java BlockingQueue理解
  2. CVE-2010-2883 从漏洞分析到样本分析
  3. 存储过程参数输入输出
  4. vue-route+webpack部署单页路由项目,访问刷新出现404问题
  5. Linux下的零拷贝
  6. sdut 活动选择问题
  7. Linux安装SonarQube和sonar-scanner详细安装及配置
  8. 微信小程序多人开发-版本管理
  9. BUUCTF web writeup
  10. ODM、JDM、OBM 、OEM概念的区别与理解
  11. 【得物技术】机器学习在图形验证码识别上的应用
  12. Java位运算优化:位域、位图棋盘等
  13. 金彩教育:店铺推广要注意的小知识
  14. 简单的封装知识 RDL,TSV, Bump,Wafer
  15. Python写简单的拼图小游戏
  16. 分享一个我大学时通过写代码,十天赚了两万块钱的经历!
  17. 写专门针对ios设备的css
  18. Java8日期/时间使用
  19. android系统recovery模式,Android系统Recovery模式中文详细说明
  20. 百度系统服务器地址,百度公共DNS地址是多少?百度DNS设置方法(windows、lunix、mac)...

热门文章

  1. 苹果屏幕尺寸_苹果iPhone 12 Pro回归小屏旗舰,采用5.4英寸三星顶级屏
  2. 如果上QQ时,不希望弹出新闻广告,不希望别人看到,下面这个软件很好。
  3. 猎豹MFC--画文本和字体DrawText TextOut CFont 阴影
  4. Android App响应时间测试方法研究
  5. EasyDL之图片分类API接口实现-基于python语言
  6. Python数据清洗之Dataframe中不同分隔符数据的清洗
  7. 125KHz 100cm ID 读卡电路_考试答题卡读卡器网站
  8. matlab矩阵稀疏,Matlab稀疏矩阵
  9. 【Javaweb】JSP基础教程
  10. 使用new bing chat成功了