首页 > 其他分享 >20230421 14. 观察者模式 - 摸鱼通知

20230421 14. 观察者模式 - 摸鱼通知

时间:2023-06-19 09:58:32浏览次数:41  
标签:20230421 name 观察者 boss String 摸鱼 Subject public 14

观察者模式 又叫作 发布-订阅(Publish/Subscribe)模式

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

观察者模式

  • Subject类,可翻译为主题或抽象通知者,一般用一个抽象类或者一个接口实现。它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
  • Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫作更新接口。抽象观察者一般用一个抽象类或者一个接口实现。更新接口通常包含一个update()方法,这个方法叫作更新方法。
  • ConcreteSubject类,叫作具体主题或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
  • ConcreteObserver类,具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。具体观察者角色可以保存一个指向具体主题对象的引用。具体观察者角色通常用一个具体子类实现。

将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便

当一个对象的改变需要同时改变其他对象而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。

抽象模型有两个方面,其中一方面依赖于另一方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用

观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化

Java已经为观察者模式准备好了相关的接口和抽象类:观察者接口java.util.Observer和通知者类java.util.Observable

代码示例

借助了JDK中的观察者接口java.util.Observer和通知者类java.util.Observable

通知者 Subject

public class Subject extends Observable {
    private String name;

    private String action;

    public Subject(String name) {
        this.name = name;
    }

    public void setAction(String action) {
        this.action = action;
        setChanged();
        notifyObservers();
    }
}


public class Boss extends Subject{
    public Boss(String name) {
        super(name);
    }
}

观察者 Observer

public class StockObserver implements Observer {
    private String name;

    public StockObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        Subject subject = (Subject) o;
        System.out.println(subject.getName() + ": " + subject.getAction());
        System.out.println(this.name + ", 请关闭股票行情,开始工作");
    }
}


public class NbaObserver implements Observer {
    private String name;

    public NbaObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        Subject subject = (Subject) o;
        System.out.println(subject.getName() + ": " + subject.getAction());
        System.out.println(this.name + ", 请关闭NBA直播,开始工作");
    }
}

客户端

public class Test {
    public static void main(String[] args) {
        StockObserver stockObserver1 = new StockObserver("张三");
        StockObserver stockObserver2 = new StockObserver("李四");
        NbaObserver nbaObserver1 = new NbaObserver("王五");

        Boss boss = new Boss("boss");

        boss.addObserver(stockObserver1);
        boss.addObserver(stockObserver2);
        boss.addObserver(nbaObserver1);

        boss.setAction("回办公室");

        System.out.println("---------------------------");

        boss.deleteObserver(stockObserver1);

        boss.setAction("检查工作");
    }
}

标签:20230421,name,观察者,boss,String,摸鱼,Subject,public,14
From: https://www.cnblogs.com/huangwenjie/p/17490361.html

相关文章

  • 20230421 13. 建造者模式 - 画小人
    '建造者模式(Builder)',又叫生成器模式建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。如果我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。Builder是为创建一个Pro......
  • P4145 上帝造题的七分钟 2 / 花神游历各国 势能
    P4145上帝造题的七分钟2/花神游历各国这道题解法很多,但我主要想提一下势能这个概念。就像重力势能一样,一个物体只会往下落,且到达零势面之后不会再继续往下落(虽然和真实情况有出入)因此,我们往往可以利用这个特性,来减少许多不必要的操作;对于这道题而言,我们发现一个数如果已......
  • 给Nexus6p刷入lineage14.1(android 7.1)和 nethunter 2019.3
    本文依据kali教程编写https://build.nethunter.com/contributors/re4son/angler/INSTALLATION.txt写在前面的话你可能很奇怪,为什么有kali2020.3不用要刷入2019.3版本的。其实目的是使用安卓7,因为高版本安卓对某些软件的兼容性太差,刷入2019载手动升级到2020.3.Andrax在安卓7、9......
  • 1483. Kth Ancestor of a Tree Node (Hard)
    Description1483.KthAncestorofaTreeNode(Hard)Youaregivenatreewithnnodesnumberedfrom0ton-1intheformofaparentarrayparentwhereparent[i]istheparentofithnode.Therootofthetreeisnode0.Findthekthancestorofagive......
  • 2024备考Week14
    一、本周总结:使用时间:(达到上周目标35h,下周目标40h)总计35h,数学5h29min,专业课18h9min,英语8h53min。二、存在问题:1.数学所花时间不够,政治,计算机网络,计算机组成原理还未开始;2.数据结构,操作系统做题不够,没有对概念达成深入的理解,南大蒋炎岩操作系统刚跟完视频,但做题没有跟上;3.学习时间......
  • chrome:保存页面上的svg(chrome 114)
     一,复制svg在开发者工具中,选中要复制的svg然后在svg上右键->copy->copyelement二,保存成文件在sublime或其他编辑工具中粘贴,file->save->保存成wordpress.svg注意:此处的width/height两项可以按自己的需求修改说明:刘宏缔的架构森林—专注it技术的博客,网站:https://bl......
  • 融合模型stacking14条经验总结和5个成功案例(互联网最全,硬核收藏)_机器学习_人工智能_
    来自Toby老师,《融合模型stacking14条经验总结和5个成功案例》我也看了很多关于融合模型stacking文章,很多作者倾向于赞美融合模型stacking,对其缺点轻描淡写,这容易误导初学者。一叶障目就是这意思。我的很多学员喜欢用融合模型作为论文或专利创新点,这是一个热门技术。最近有个同学在......
  • 【雕爷学编程】Arduino动手做(114)---US-015高分辨超声波模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是......
  • ASEMI代理光宝光耦LTV-6314的工作原理和应用领域
    编辑-Z本文将详细介绍光耦LTV-6314的工作原理和应用领域。首先,我们将介绍光耦的基本概念和工作原理。然后,我们将详细解析LTV-6314的特点和性能参数。接下来,我们将探讨LTV-6314在电力控制、通信设备和工业自动化等领域的应用。最后,我们将总结光耦LTV-6314的优势和适用性。 1、光耦......
  • 了解ASEMI代理光宝光耦LTV-6314的工作原理和应用领域
    编辑-Z本文将详细介绍光耦LTV-6314的工作原理和应用领域。首先,我们将介绍光耦的基本概念和工作原理。然后,我们将详细解析LTV-6314的特点和性能参数。接下来,我们将探讨LTV-6314在电力控制、通信设备和工业自动化等领域的应用。最后,我们将总结光耦LTV-6314的优势和适用性。 1、......