文章目录

  • 观察者模式
  • 介绍
  • 业务场景
  • 实现
  • 运行结果

观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

介绍

意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

如何解决:使用面向对象技术,可以将这种依赖关系弱化。

关键代码:在抽象类里有一个 ArrayList 存放观察者们。

应用实例: 1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。

优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。

缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

使用场景:

一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
一个对象必须通知其他对象,而并不知道这些对象是谁。
需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
注意事项: 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。

业务场景

策略模式可使用的场景特别多,比如店铺级别,会员级别计算,各种不同支付的方式,JT808应答消息处理等等。

实现

观察者模式使用三个类 Subject、Observer 和 Client。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。

ObserverPatternDemo,我们的演示类使用 Subject 和实体类对象来演示观察者模式。

观察者模式的 UML 图

代码:
观察对象Subject

/*** @Author chenxintao* @Date 2022/10/26 11:17* @Version 1.0* 主体类,即被观察者,一有变化,其他观察者需要根据主体变化进行变化*/
public class Subject {//存储观察者private List<Observer> observers = new ArrayList<Observer>();//被观察的属性private int state;public int getState() {return state;}//一有变化全部都观察者都应该知道public void setState(int state) {this.state = state;notifyAllObservers();}//连接:主体和观察者生产连接public void attach(Observer observer){observers.add(observer);}//解绑public void delattach(Observer observer){Iterator<Observer> iter = observers.iterator();while (iter.hasNext()) {Observer item = iter.next();//同一内存对象即解绑if (observer == item) {System.out.println("remove observer:"+item);iter.remove();}}}//通知所有观察者public void notifyAllObservers(){for (Observer observer : observers) {observer.update();}}
}

抽象的观察者

/*** @Author chenxintao* @Date 2022/10/26 11:19* @Version 1.0* 观察者,观察到变化,需要执行更新*/
public abstract class Observer {protected Subject subject;public abstract void update();
}
public class BinaryObserver extends Observer{public BinaryObserver(Subject subject){this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Binary String: "+ Integer.toBinaryString( subject.getState() ) );}
}
public class HexaObserver extends Observer{public HexaObserver(Subject subject){this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Hex String: "+ Integer.toHexString( subject.getState() ).toUpperCase() );}
}
public class OctalObserver extends Observer{public OctalObserver(Subject subject){this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Octal String: "+ Integer.toOctalString( subject.getState() ) );}
}

测试代码:

public class ObserverPatternDemo {public static void main(String[] args) {Subject subject = new Subject();new HexaObserver(subject);new OctalObserver(subject);BinaryObserver binaryObserver = new BinaryObserver(subject);System.out.println("First state change: 15");subject.setState(15);subject.delattach(binaryObserver);System.out.println("Second state change: 10");subject.setState(10);}}

运行结果

Hex String: F
Octal String: 17
Binary String: 1111
remove observer:com.tho.domain.observer.BinaryObserver@4d7e1886
Second state change: 10
Hex String: A
Octal String: 12

转自:菜鸟教程https://www.runoob.com/design-pattern/observer-pattern.html

Java实现常用设计模式之观察者模式相关推荐

  1. PHP实现常用设计模式之观察者模式

    观察者模式定义对象的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新! 设计原则 在观察者模式中,会改变的是目标对象的状态以及观察者的数目.用这个模式,你可以改变依赖于 ...

  2. java后台常用设计模式_Java中几个常用设计模式

    1.单例模式(有的书上说叫单态模式其实都一样) 该模式主要目的是使内存中保持1个对象.看下面的例子: package org.sp.singleton; //方法一 public class Sing ...

  3. Java常用设计模式(一)

      当代软件开发中,设计模式已经成为一种标准的编程实践.在Java编程中,设计模式也同样重要.Java设计模式是软件开发中广泛应用的一种编程方法,它可以帮助开发人员更快地编写出高效.可靠和可维护的代码 ...

  4. java几种常用设计模式简单示例

    1.单例设计模式 所谓单例设计模式简单说就是无论程序如何运行,采用单例设计模式的类(Singleton类)永远只会有一个实例化对象产生.具体实现步骤如下: (1) 将采用单例设计模式的类的构造方法私有 ...

  5. JAVA常用设计模式(一、单例模式、工厂模式)

    JAVA设计模式之单例模式 import java.util.HashMap; import java.util.Map;/*** 设计模式之单例模式* 单例模式(Singleton Pattern) ...

  6. java 观察者模式_图解Java设计模式之观察者模式

    图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...

  7. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

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

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

  9. 初学Java常用设计模式之——原型模式

    声明:转载请附上原文链接 提示:标题序号从3开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--工厂模式 序号从2开始. 标题后面之所以加上了解,是因为相对 ...

最新文章

  1. 【Linux系统编程】线程与进程的比较
  2. Qunit 和 jsCoverage使用方法(js单元测试)
  3. spring-boot注解详解(二)
  4. linux下覆盖文件命令,在Linux中使用命令行进行文件覆盖的操作
  5. 前端学习(3336):ant design中button按钮类型
  6. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期上涨2.62%
  7. oracle中schema是什么,ORACLE中的两个概念:user和schema的区别和联系
  8. 从Chrome源码看JS Array的实现
  9. activiti7关联mysql_解决Springboot2.1.x配置Activiti7单独数据源问题
  10. 测试开发是什么?什么是测试开发工程师?
  11. Spring Cloud 微服务速成
  12. php搜索银行所在支行,多家银行宣布启动社区支行战略但风光不再
  13. 计算机在平面设计中的作用,计算机在平面设计中应用2篇.docx
  14. 海康IPC摄像头通过ONVIF协议接入VCN离线
  15. 何谓SRIO——RapidIO之旅从这里开始
  16. 计算机视觉编程 第六章 图像聚类
  17. ttf-dejavu fontconfig字体
  18. 一个优秀妹子的后台面试经验,含泪总结...
  19. layui字体样式设置_layui如何自定义字体图标?(图文介绍)
  20. 要求微信支付的勒索病毒作者被捕;网络游戏道德委员会近期成立

热门文章

  1. 数据库系统知识总结(一):数据库系统基础知识
  2. 混音服务器系统盘,电脑开启和关闭立体声混音的详细步骤
  3. HashMap和Set接口解决地铁收费问题
  4. 【Cadence16.6—Day3】用Cadence16.6绘制STM32H743最小系统原理图
  5. VTD链接不到license
  6. device-mapper: remove ioctl on 320d408ca45023fc0 failed:设备或资源忙
  7. [Android]挂断、接听电话
  8. 解析Java-throw抛出异常详细过程
  9. 硬纪元AI峰会实录|华捷艾米沈瑄:端加云才是AI和AR的未来
  10. intel-Altera design template installation failed