首页 > 其他分享 >设计模式--观察者模式

设计模式--观察者模式

时间:2023-08-15 22:12:19浏览次数:37  
标签:订阅 Observer -- void 观察者 发布者 设计模式 public

简介

观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个 “观察” 该对象的其他对象。例如,Excel中的数据与折线图、饼状图、柱状图之间的关系


组成

  • 发布者(Publisher) 会向其他对象发送关注的事件。 事件会在发布者自身状态改变或执行特定行为后发生。 发布者中包含一个允许新订阅者加入和当前订阅者离开列表的订阅构架
  • 订阅者(Subscriber)  接口声明了通知接口。 在绝大多数情况下, 该接口仅包含一个 update更新方法。 该方法可以拥有多个参数, 使发布者能在更新时传递事件的详细信息
  • 具体订阅者(Concrete Subscribers) 可以执行一些操作来回应发布者的通知。 所有具体订阅者类都实现了同样的接口, 因此发布者不需要与具体类相耦合
  • 客户端(Client) 会分别创建发布者和订阅者对象, 然后为订阅者注册发布者更新


实现方式

声明观察者接口

该接口至少应声明一个 response 方法接收信息推送

public interface Observer {
    void response();
}

具体观察者实现

public class ConcreteObserver1 implements Observer{
    @Override
    public void response() {
        System.out.println("观察者1收到消息");
    }
}
public class ConcreteObserver2 implements Observer{
    @Override
    public void response() {
        System.out.println("观察者2收到消息");
    }
}

声明发布者抽象类

声明发布者抽象类并定义一些接口来在列表中添加和删除订阅对象

public abstract class Subject {

    List<Observer> observerList = new ArrayList<>();

    public void addObserver(Observer observer) {
        observerList.add(observer);
    }

    public void removeObserver(Observer observer) {
        observerList.remove(observer);
    }

    public abstract void notifyObserver();
}

创建具体发布者类

每次发布者发生了重要事件时都必须通知所有的订阅者

public class ConcreteSubject extends Subject{

    @Override
    public void notifyObserver() {
        System.out.println("内容发生改变,通知观察者");
        for (Observer observer : observerList) {
            observer.response();
        }
    }
}

客户端使用

public class Main {

    public static void main(String[] args) {
        Subject subject = new ConcreteSubject();
        subject.addObserver(new ConcreteObserver1());
        subject.addObserver(new ConcreteObserver2());
        subject.notifyObserver();
    }
}

优势和缺点

优势

  • 符合开闭原则
  • 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系
  • 目标与观察者之间建立了一套触发机制

缺点

  • 订阅者的通知顺序是随机的
  • 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率
  • 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用

使用场景

当一个对象状态的改变需要改变其他对象, 或实际对象是事先未知的或动态变化的时,可使用观察者模式


Java中使用案例

  • java.util.Observer/java.util.Observable (极少在真实世界中使用)
  • java.util.EventListener的所有实现 (几乎广泛存在于 Swing 组件中)

识别方法: 该模式可以通过将对象存储在列表中的订阅方法, 和对于面向该列表中对象的更新方法的调用来识别

标签:订阅,Observer,--,void,观察者,发布者,设计模式,public
From: https://www.cnblogs.com/52-IT-y/p/17630984.html

相关文章

  • OpenCL Notebook 1
    平台模型OpenCL平台总是包括一个宿主机(host)。宿主机与OpenCL程序外部的环境交互,包括I/O或与程序用户的交互。宿主机与一个或多哥OpenCL设备连接。OpencL设备通常称为计算设备,设备可以是CPU,GPU、DSP或硬件提供以及OpenCL开发商支持的任何其他处理器。OpenCL进一步划分为计算单元......
  • 【FPGA】 DDR3读写(基于User Interface)
    【FPGA】DDR3读写(基于UserInterface)DDR3概述DDR3(doubledatarate3synchronousdynamicRAM)第三代双倍数据速率同步动态随机存储器同步:数据的速去和写入时钟同步动态:数据掉电无法保存,需要周期性刷新才能保持数据随机存取:能够对任意地址进行操作双倍数据速率:时钟的......
  • IOC(控制反转)
    1、通过下面这个案例来理解IOC这种思想创建一个项目,建一个dao层的包。在包下建立一个UserDao接口,里面写一个方法。再写这个接口的几个实现类,每个实现类中的方法实现不同的效果。建一个service层的包,下面写一个UserService接口,然后写接口实现类,实现类就是调用Dao层的方法(用以下......
  • Long-term Forecasting with TiDE: Time-series Dense Encoder 学习笔记
    Long-termForecastingwithTiDE:Time-seriesDenseEncoder论文地址:https://arxiv.org/abs/2304.08424代码地址:https://github.com/google-research/google-research/tree/master/tide摘要:这篇论文提出了时间序列密集编码器(TiDE),一种基于MLP的编码器-解码器模型,用于长期时......
  • java基础04
    变量变量就是变化的量Java是强类型语言,每个变量都必须声明类型Java变量是程序中最基本的单元,其要素包括变量名,变量类型和作用域如何定义变量?例:tybe/*数据类型*/varName/*变量名*/[=value/*=值*/]不建议一行多个变量每个变量必须有类型,可以是基础类型,也可以是引用类型......
  • JavaSE--异常处理机制
    一、异常exception1、什么是异常,以及Java提供的异常处理机制  程序执行过程中发生了不正常的情况,而这种不正常的情况叫做:异常  java语言提供了异常的处理方式,如果程序执行过程中出现了不正常情况,  java把该异常信息打印输出到控制台,供程序员参考。程序员看到异常信息之......
  • JAVA向Mysql插入亿级数量数据各种方式效率对比
    研究mysql优化中查询效率,通过随机生成人的姓名、年龄、性别、电话、email、地址,向mysql数据库大量插入数据,便于用大量的数据测试SQL语句优化效率。生成过程中发现使用不同的方法,效率天差万别。1、先上Mysql数据库,随机生成的人员数据图。分别是ID、姓名、性别、年龄、Email、电话......
  • PCBA加工厂发货要如何做好运输保护?
    PCBA加工完成之后,在出货运输过程中PCBA板可能会受到颠簸、碰撞、摩擦等各种因素的影响,那我们怎么做好保护措施呢?PCBA在经过SMT贴片加工、插件、组装测试等各种加工过程后就要面临发货的问题,在发货的运输过程中需要注意是下面的几个方面。1、包装材料PCBA是比较脆弱并且容易被损坏的......
  • Python教程(9)——Python变量类型列表list的用法介绍
    (目录)在Python中,列表(list)是一种有序、可变的数据结构,用于存储多个元素。列表可以包含不同类型的元素,包括整数、浮点数、字符串等。实际上列表有点类似C++语言中的数组,但仅仅只是类似,和数组还是有点不一样的。列表非常适合利用顺序和位置定位某一元素,尤其是当元素的顺序或内容经常......
  • java中对无参构造和有参构造的理解
    构造器的最大作用就是在创建对象时,对对象实例进行初始化。1.一个类即使什么都不写,也会存在无参构造方法。2.无参构造方法没有返回值类型,且方法名称和类名相同。比如:1publicclassStudent{2privateStringname;3privateintage;45publicvoidst......