首页 > 其他分享 >设计模式 - 观察者模式以及存在的问题

设计模式 - 观察者模式以及存在的问题

时间:2023-07-02 17:00:41浏览次数:39  
标签:Observable Observer observable void 观察者 模式 设计模式 public

观察者模式 其实可以称之为发布订阅模型的 ,因为里面有一个Observable 和一个Observer , 我这个Observable为可以观察到的意思 , 意思就是对外可见的, 所以可以称之为发布者(publisher) , 其他的Observer可以称之为订阅者 (subscriber) ,是对外不可见的 .

1. JDK的观察者模式

 java.util.Observable 这个类和java.util.Observer这个类是一个JDK给我们提供的框架 , 我们分析一波

1. Observable

文章最前面已经介绍过了 , 所以就直接讲了, 他就是一个管理观察者的对象

设计模式 - 观察者模式以及存在的问题_ide

我们看这张图, 主要是分为addObserver 方法 ,表示添加一个观察者 , 与之对应的就是deleteObserver 移除了,

还有就是notifyObservers 就是通知观察者了 , 其他的就不多说了 , 观察者通过一个Vector安全数组来维护 , 通知的时候遍历通知 ,

2. Observer

观察者对象

public interface Observer {
    /**
     * This method is called whenever the observed object is changed. An
     * application calls an <tt>Observable</tt> object's
     * <code>notifyObservers</code> method to have all the object's
     * observers notified of the change.
     *
     * @param   o     the observable object.
     * @param   arg   an argument passed to the <code>notifyObservers</code>
     *                 method.
     */
    void update(Observable o, Object arg);
}

他存在的问题我们后续说 ,

2. 基于JDK接口去实现

发布者

public class MyObservable extends Observable {

    @Override
    protected synchronized void setChanged() {
        super.setChanged();
    }

    @Override
    public synchronized void addObserver(Observer o) {
        super.addObserver(o);
    }

    @Override
    public synchronized boolean hasChanged() {
        return super.hasChanged();
    }
}

订阅者

public class MyObserver implements Observer {

    private String name;

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

    @Override
    public void update(Observable o, Object arg) {
        System.out.println(this.name+" 收到消息 : "+arg);
    }
}

测试Demo

public class Demo {


    public static void main(String[] args) {
        MyObservable observable = new MyObservable();

        // 添加观察者
        observable.addObserver(new MyObserver("tom"));
        observable.addObserver(new MyObserver("tony"));

        // 必须修改, 不然没法通知到
        observable.setChanged();

        // 通知
        observable.notifyObservers("安星是个傻子");

    }
}

输出

tony 收到消息 : 安星是个傻子
tom 收到消息 : 安星是个傻子

3. 存在的问题

我们发现所有的观察者都没有主动权, (这里的意思是对于观察的对象,没有可选择性) , 管理观察者的呢 ,通知观察者的时候,所有加入的观察者全部收到, 这种模式发现很有问题 , 没有隐私性, 大锅饭 , 所以JDK 这种模式的设计基本无人问津 , 一般都是自己实现的

所以直接转向 `事件监听者模式` 了

标签:Observable,Observer,observable,void,观察者,模式,设计模式,public
From: https://blog.51cto.com/u_16173732/6605956

相关文章

  • 设计模式之观察者模式
    定义定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式的UML类图及说明如上图(图片来源于《head_first设计模式》)所示,观察者的uml中主要有以下类1.主题Subject(接口)Subject对象带有绑定观察者到Client对象和从Cl......
  • 设计模式之观察者模式
    定义定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式的UML类图及说明  如上图(图片来源于《head_first设计模式》)所示,观察者的uml中主要有以下类1.主题Subject(接口)Subject对象带有绑定观察者到Clien......
  • SpringBoot 插件化开发模式
    1、Java常用插件实现方案1.2、serviceloader方式serviceloader是java提供的spi模式的实现。按照接口开发实现类,而后配置,java通过ServiceLoader来实现统一接口不同实现的依次调用。而java中最经典的serviceloader的使用就是Java的spi机制。1.2.1、javaspiSPI全称ServiceProv......
  • [PLC]Proface普洛菲斯进入离线模式的方法
       进入离线的方法参考手册第M.1.2章节进入离线模式    Proface ChinaTechnical Support DepartmentSky 进入离线的方法参考手册第M.1.2章节进入离线模式 进入离线的方法•  方法1  上电时直接进入离线在显示开始画面后, 触摸屏幕右......
  • Cocos Creator开发之MVC模式初探
    设计模式是用来实现软件设计进行分工的。设计模式应该是小巧的,对具体问题提出解决方案,以提高代码复用率,提高代码耦合性。CocosCreator中引入MVC模式的主要目的是:为了帮助CocosCreator开发者脱离拖拽脚本导致的后期维护方面带来的困难。一、基本的MVC模式组成控制器(Controller)-负......
  • 模式的真正价值是什么?
    在于交付的时候解决方案是否能正常工作并满足需求。模式就是其他人已经遇到过并加以分类的问题的解决方案。重构模式的时候需要判断是否能够更好地适应未来的变化,并对当前的解决方案有所改进。软件架构师大多是关于决定的。反模式是一种介绍如何从问题演化到不好的解决方案的模......
  • PostgreSQL 数据库与模式(二)
    删除数据库如果确定一个库不需要了,可以使用DROPDATABASE语句删除一个数据库(工作中谨慎删库):DROPDATABASE[IFEXISTS]name;如果使用了IFEXISTS,删除一个不存在的数据库时不会产生错误信息。删除数据库会同时删除该数据库中所有的对象,以及文件系统中的数据目录。只有数据库......
  • Settle Finance:以区块链技术为核心的P2P借贷模式
    "在数字化世界中,我们看到了许多技术进步如何推动金融行业的革新。其中,Peer-to-Peer(P2P)借贷模式的出现为借贷市场带来了新的可能性。然而,这个模式也带来了诸多问题,尤其是在信任和安全性方面。随着区块链技术的兴起,我们看到了它在改善P2P模式中的这些问题上的巨大潜力。区块链的......
  • ACM模式机考准备指南
    1熟练掌握格式化输入输出方法ACM模式需要题目要求,按照规定的格式自己手动写输入和输出的代码,如果没有充分准备,考试的时候就有可能会在输入输出这块卡很久,浪费考试的时间,反之,如果能够掌握各种格式的输入输出方法,则可以让我们在考试的时候快速完成输入输出代码的编写,节省出更多的......
  • 什么是 CSR、SSR、SSG、ISR - 渲染模式详解
    本文以React、Vue为例,介绍下主流的渲染模式以及在主流框架中如何实现上述的渲染模式。前置知识介绍看渲染模式之前我们先看下几个主流框架所提供的相关能力,了解的可跳到下个章节。挂载组件到DOM节点这是主流框架最基本的能力,就是将组件渲染到指定的DOM节点上。在React......