设计模式--观察者模式

news2024/9/24 7:51:04

文章目录

  • 前言
  • 一、未使用设计模式
  • 二、观察者模式
    • 1.定义
    • 2.组成
  • 三、应用场景
  • 四、优缺点


前言

甲人A(产品经理):好啊,你小子,又被我逮到了,很闲是吧😇,需求完成了吗?
two days later…

芯不小:猫啊(自称),手速不够快啊!又被小甲逮到了。我苦心专研了数十载,开发了一个探A 【主题】,但是还缺一个app,不然你来试试😘

需求:
建立一个应用,事实汇报甲人A的方位,并传给芯不小和猫 【观察者】。
同时也是一个可扩展的,我们也要赚money嘛,只要支付一定的¥,我们就可以让更多人享受此服务


一、未使用设计模式

本着为人民服务的宗旨🤑,我义不容辞

public class Tana {

    private String position;
    public String getPosition() {
        return position;
    }
    public void positionChanged(){
        String loc=getPosition();
        user1.update(loc);
        user2.update(loc);
    }
}

芯不小:既然我们知道在未来会有许多的人订阅这项服务,也会有人取消,未来就不得不在代码中进行修改操作。而这就会大大增加代码的耦合度。不妨再改改😘

松耦合的强大之处
当两个对象之间松耦合,它们之间依然可以交互,但不太清除彼此的细节


二、观察者模式

1.定义

观察者模式定义了对象之间一对多的关系,这样一来,当一个对象改变状态时,它的所有依赖着都会收到并自动更新

2.组成

在这里插入图片描述

  • 抽象主题(Subject):主题是一个接口,该接口规定了具体主题需要实现的方法,比如,添加、删除观察者以及通知观察者更新数据的方法。

  • 具体主题(ConcreteSubject):具体主题是实现主题接口类的一个实例,该实例包含有可以经常发生变化的数据。具体主题需使用一个集合,比如ArrayList,存放观察者的引用,以便数据变化时通知具体观察者。

  • 抽象观察者(Observer):观察者是一个接口,该接口规定了具体观察者用来更新数据的方法。

  • 具体观察者(ConcreteObserver):具体观察者是实现观察者接口类的一个实例。具体观察者包含有可以存放具体主题引用的主题接口变量,以便具体观察者让具体主题将自己的引用添加到具体主题的集合中,使自己成为它的观察者,或让这个具体主题将自己从具体主题的集合中删除,使自己不再是它的观察者。

抽象观察者:

public interface Observer {
    public void update(String position);
}

具体观察者:

public class User implements Observer {
    // 订阅者名字
    private String name;
    public User(String name) {
        this.name = name;
    }
    @Override
    public void update(String position) {
        System.out.println(name + "-" + position);
    }

}

抽象主题:

public interface Subject {
    /**
     * 增加订阅者
     */
    public void attach(Observer observer);
    /**
     * 删除订阅者
     */
    public void detach(Observer observer);
    /**
     * 通知订阅者更新消息
     */
    public void notify(String position);
}

具体主题:

public class SubscriptionSubject implements Subject {
    //储存订阅用户
    private List<Observer> userlist = new ArrayList<>();

    @Override
    public void attach(Observer observer) {
        userlist.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        userlist.remove(observer);
    }

    @Override
    public void notify(String position) {
        for (Observer observer : userlist) {
            observer.update(position);
        }
    }
}

public class Client {
    public static void main(String[] args) {
        SubscriptionSubject subscriptionSubject=new SubscriptionSubject();
        //创建用户
        User user1=new User("猫");
        User user2=new User("芯不小");
        //订阅
        subscriptionSubject.attach(user1);
        subscriptionSubject.attach(user2);
        //发出消息
        subscriptionSubject.notify("甲A来了");
    }
}

三、应用场景

  • 当一个对象的数据更新时需要通知其他对象,但这个对象又不希望和被通知的那些对象形成紧耦合。

  • 当一个对象的数据更新时,这个对象需要让其他对象也各自更新自己的数据,但这个对象不知道具体有多少对象需要更新数据。


四、优缺点

  • 主题只知道观察者实现了某个接口,我们可以在任何时候增加新的观察者,同时主题的代码不用修改。当我们在其他的地方需要使用主题或观察者时,可以轻松的复用。
  • 观察者模式满足开闭原则

  • 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。此问题可以使用pull解决

  • 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。


终于完成啦,芯啊,这副业不就🤑,嘿嘿
芯不小:猫啊,格局,格局

某天,甲人A的办公室传来了一个声音
猫,正在摸鱼…
XXX,在浏览短视频网站…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/66934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MOSFET 和 IGBT 栅极驱动器电路的基本原理学习笔记(三)同步整流器驱动

同步整流器驱动 1.栅极电荷 2.dv/dt注意事项 MOSFET 同步整流器是接地基准开关的一个特例。这些器件与传统应用所使用的 N 沟道 MOSFET 相同&#xff0c;只是它们被应用到了电源的低电压输出而非整流器二极管中。 它们通常可在非常有限的漏源极电压摆幅下工作&#xff0c;因此…

redis活跃非活跃连接数统计及client list说明

概念说明 活跃连接是指当下正在执行命令的连接&#xff0c;非活跃当然是相对的。 在redis中判断当前连接是否活跃是通过 内置的client list 命令输出中的idle来判断 client list字段说明 (kfzops) [roottest-xxx-01-vm ]# redis-cli -h r-xxxxxxxxxxxx.redis.rds.aliyuncs.…

学生身份标签的识别与风控应用

当前的互联网借贷平台&#xff0c;国家已明确规定不允许向高校学生发放贷款&#xff0c;因此对于小贷、消金等金融机构&#xff0c;在信贷产品业务的风控体系中&#xff0c;有效判断申请用户是否为高校学生是一个非常重要的问题。针对高校学生身份的识别&#xff0c;虽然有多种…

机器学习、深度学习、自然语言处理学习 NLP-RoadMap-996station GitHub鉴赏官

推荐理由&#xff1a; 机器学习、深度学习、自然语言处理学习路线图 及 AI方向学习资源、工具 NLP-RoadMap 持续更新中。以下内容有错误或者不足&#xff0c;欢迎提Issue或者联系我讨论 整理不易&#xff0c;希望点个小星星 ​支持下呀&#xff01; 前言 数理基础 编程基础 机…

RE2:Simple and Effective Text Matching with Richer Alignment Features

原文链接&#xff1a;https://aclanthology.org/P19-1465.pdf 介绍 问题 作者认为之前文本匹配模型中序列对齐部分&#xff0c;过于复杂。只有单个inter-sequence alignment层的模型&#xff0c;常会引入外部信息&#xff08;例如语法特征&#xff09;作为额外输入&#xff0c;…

小游戏与H5游戏对比与梳理

H5游戏是运用了h5技术的响应式网站布局的游戏&#xff0c;它完全实现了网页游戏在手机移动端的无缝衔接。众所周知&#xff0c;H5游戏已盛行了多年&#xff0c;而如今&#xff0c;随着诸多小游戏的推出&#xff0c;小游戏爆款频出&#xff0c;从“跳一跳”到“羊了个羊”&#…

Leetcode---2465.不同的平均值数目

目录题目描述分析题目描述 给你一个下标从 0 开始长度为 偶数 的整数数组 nums 。 只要 nums 不是 空数组&#xff0c;你就重复执行以下步骤&#xff1a; 找到 nums 中的最小值&#xff0c;并删除它。 找到 nums 中的最大值&#xff0c;并删除它。 计算删除两数的平均值。 两…

Qt OpenGL 2D图像文字

这次教程中&#xff0c;我们将学会如何使用四边形纹理贴图把文字显示在屏幕上。我们将把256个不同的文字从一个256256的纹理图像中一个个提取出来&#xff0c;接着创建一个输出函数来创建任意我们希望的文字。 还记得在第一篇字体教程中我提到使用纹理在屏幕上绘制文字吗&…

springboot构建RESTful 风格应用

Spring Boot 构建 RESTful 风格应用 1.Web开发的两种模式&#xff1a; 前后端不分离&#xff1a; 以前没有移动互联网时&#xff0c;我们做的大部分应用都是前后端不分的&#xff0c;比如jsp&#xff0c;或者thymeleaf等后端分离模板&#xff0c;在这种架构的应用中&#xf…

SQLMAP _DNS注入配置方法

网上针对sqlmap进行dns注入的相关文章太少&#xff0c;只是简单介绍了下–dns-domain参数&#xff0c;相关的实战文章要么就模糊或者一笔带过&#xff0c;。然后参考网上的方法重新整理了一遍&#xff0c;简单理解。 需要准备的东西&#xff0c;sqlmap、windows盲注一个、两个…

档案信息化咨询方法论实践要点有哪些?

咨询工作中&#xff0c;有些咨询师也许会有这样的疑问&#xff1a;“我业务经验挺丰富的&#xff0c;但做咨询工作怎么这么吃力呢&#xff1f;”这可能就是因为缺乏方法论的有效指导。咨询方法论是咨询工作中用来分析和解决某类特定问题的工具、方法、流程、模型和评价准则等。…

Ansible之playbook详解和应用实例

目录 一、playbook简介 1.什么是playbook 2.playbook组成 二、应用实例 1.使用playbook安装启用httpd服务 2.使用playbook安装启用nginx服务 三、ansible-playbook其他用法 1.检查yaml文件的语法是否正确 2.检查tasks任务 3.检查指定的主机 4.指定从某个task开始运行…

红队学习隧道必须了解的知识

端口映射和端口转发 端口映射 端口映射就是将外网的主机的一个端口映射到内网主机的一个端口&#xff0c;提供相应的服务。当用户访问外网IP的这个端口时&#xff0c;服务器自动将请求映射到对应局域网内部的机器上 端口转发 端口转发就是将发往外网指定端口的通信完全转发给…

windows下安装hbase

windows下安转hbase 安装流程 解压提供的压缩包 该压缩包是经过我修改后的&#xff0c;已经创建data、tmp、zookeeper目录和替换相关配置文件&#xff0c;目的是简化安装流程 压缩包 https://share.weiyun.com/SLTS9woO 环境变量配置 在系统变量中添加HBASE_HOME环境变量&…

Java ConcurrentHashMap 高并发安全实现原理解析

三、C13Map的字段定义 C13Map的字段定义 //最大容量 private static final int MAXIMUM_CAPACITY 1 << 30; //默认初始容量 private static final int DEFAULT_CAPACITY 16; //数组的最大容量,防止抛出OOM static final int MAX_ARRAY_SIZE Integer.MAX_VALUE -…

使用pyautogui进行PC用户界面自动化测试

目录 1.pyautogui简介及安装 2.pyautogui常见用法 2.1返回所用显示器的分辨率 2.2键盘输入函数 2.3常用函数typewrite() 2.4键盘事件 2.5函数hotkey() 2.6保存屏幕截图 3.常见用法代码汇总 1.pyautogui简介及安装 Pyautogui是一个纯Python的图形化自动化工具&#x…

代码审计-4 代码执行漏洞

代码执行漏洞 代码执行漏洞利用 ZZZPHP1.6 远程代码执行漏洞分析 漏洞点函数 此处如果能控制$ifstr就可以进行闭合&#xff0c;执行恶意代码 parserIfLabel函数将传入的参数进行正则匹配&#xff0c;当匹配通过时继续往下走 下面并没有对恶意代码内容进行过滤 跟踪parserIfLab…

游戏开发37课 狙击枪 视野问题

首先说一下视野的思路&#xff1a;我们可视化的视野全部都是以扇形显示的&#xff0c;同时为了后期的方便调整我们的视野和距离都必须是动态的。那么我们是不是可以使用度数来控制视野范围&#xff0c;那么我们就需要画出一个扇形。那么我们可以先画出来一个圆 然后在这个圆上面…

Linux安装 vmware workstation

官网下载地址 vmware workstation&#xff1a; Download VMware Workstation Pro 也可以下载提供的安装包。 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;au74 一、Ubuntu 安装 安装构建依赖项&#xff0c;打开您的系统终端并运行以下命令&#xff1a; s…

Linux操作系统中的yum命令

Linux操作系统中的yum命令是大家经常会用到的命令&#xff0c;有着非常重要的作用&#xff0c;但很多朋友依然不太清楚yum命令作用是什么&#xff1f;yum命令有哪些语法和常用命令&#xff1f;接下来我们一起来看看详细的内容介绍。 yum命令全称为Yellow dog Updater, Modified…