设计模式—观察者模式

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。

在观察者模式中,有两个核心角色:

  1. Subject(主题):也称为被观察者或可观察对象,它是具有状态的对象,当其状态发生变化时,会通知所有的观察者。

  2. Observer(观察者):也称为订阅者或观察者,它定义了一个接口,用于接收主题的通知,并进行相应的处理。

观察者模式的工作原理如下:

  1. 主题维护一个观察者列表,用于存储所有订阅该主题的观察者。

  2. 当主题的状态发生变化时,会遍历观察者列表,依次调用每个观察者的更新方法。

  3. 观察者收到通知后,根据主题的状态进行相应的处理。

观察者模式的优点包括:

  • 解耦性:主题和观察者之间是松耦合的,它们可以独立地进行扩展和修改,互不影响。

  • 可扩展性:可以方便地增加新的观察者,以及在不修改主题代码的情况下增加新的主题。

  • 易于维护:由于主题和观察者之间的关系是明确的,代码的维护和调试相对容易。

举个例子:被观察者=新闻,观察者有“播放新闻”和“打印新闻”,当有新的新闻产生时,立刻播放和打印新闻。(建议尽量面向抽象编程、接口编程)

先定义观察者和被观察者的抽象类。

/*** 观察者抽象*/
public abstract class Observer {/*** 处理新闻内容* @param msg*/public abstract void handle(String msg);/*** 观察者的身份* @return*/public abstract String identity();
}
/*** 被观察者抽象*/
public abstract class Subject {/*** 观察者列表*/public List<Observer> observerList;/*** 加入观察者* @param observer*/public abstract void register(Observer observer);/*** 剔除观察者* @param observer*/public abstract void cancel(Observer observer);/*** 通知内容* @param msg*/public abstract void notice(String msg);
}

再定义新闻类,继承了被观察者抽象类,表示自己是某个具有实际业务含义的被观察者。

public class News extends Subject {public News() {this.observerList = new ArrayList<>();}@Overridepublic void register(Observer observer) {this.observerList.add(observer);}@Overridepublic void cancel(Observer observer) {for (Observer ob : this.observerList) {if (ob.identity().equals(observer.identity())) {this.observerList.remove(ob);}}}@Overridepublic void notice(String msg) {for (Observer ob : this.observerList) {ob.handle(msg);}}
}

定义播放新闻类和打印新闻类,表示具体的观察者。

public class PlayNews extends Observer {Logger logger = LoggerFactory.getLogger(PlayNews.class);@Overridepublic void handle(String msg) {logger.info("播放新闻:{}", msg);}@Overridepublic String identity() {return "play";}
}public class PrintNews extends Observer {Logger logger = LoggerFactory.getLogger(PrintNews.class);@Overridepublic void handle(String msg) {logger.info("打印新闻:{}", msg);}@Overridepublic String identity() {return "print";}
}

测试一下:

public class Test {public static void main(String[] args) {News news = new News();PlayNews playNews = new PlayNews();PrintNews printNews = new PrintNews();news.register(playNews);news.register(printNews);news.notice("油价微涨1元");news.cancel(playNews);news.notice("油价暴跌1分");}
}

个人理解:

1、观察者模式类似于发布-订阅,需要被观察者发出信息让观察者去处理,但是又与发布-订阅模式不同,观察者与被观察者是直接联系,互相有感知,中间没有第三方角色存在,而发布-订阅模式中,发布者与订阅者之间有第三方角色存在,比如kafka中,生产者发送消息到 topic,消费者从topic获取消息,而不是生产者直接发消息给消费者,更多地是体现发布者与订阅者之间的相互无感知,解耦,以及异步机制。

2、观察者模式的亮点在于它的“加入观察者”、“剔除观察者”思想,适合那些观察者随时可变的场景,否则就没什么特点可言了,还不如策略模式。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes(k8s)集群部署----->超详细

Kubernetes&#xff08;k8s&#xff09;集群部署-----&#xff1e;超详细 一、资源准备二、安装准备2.1 主机环境设置2.1.1 关闭操作系统防火墙、selinux2.1.2 关闭swap交换分区2.1.3 允许iptables检测桥接流量&#xff08;可选&#xff09; 2.2 安装Docker环境2.3 安装Kubeadm…

云基础软件深化合作,云轴科技ZStack与麒麟软件战略签约

12月8日&#xff0c;云轴科技ZStack与麒麟软件战略合作签约仪式在北京举行&#xff0c;双方对过往紧密合作表达了充分肯定&#xff0c;并就进一步联合技术创新、打造重点行业标杆和持续赋能客户达成高度共识。云轴科技创始人&CEO张鑫和麒麟软件高级副总经理谢文征共同见证双…

【EventBus】EventBus源码浅析

二、EventBus源码解析 目录 1、EventBus的构造方法2、订阅者注册 2.1 订阅者方法的查找过程2.2 订阅者的注册过程1. subscriptionsByEventType 映射&#xff1a;2. typesBySubscriber 映射&#xff1a;2.3 总结订阅者的注册过程 3、事件的发送 3.1 使用Post提交事件3.2 使用p…

c++国际象棋有人机qt5.9.9启动chesss

项目简介&#xff1a; 利用C的知识和QT以及一些自行拓展的新知识&#xff0c;实现国际象棋的开发。 使自己更加深层的理解和掌握c并在程序中展现出来&#xff0c;同时开发编程的思想和能力&#xff0c;以及扩展知识面&#xff0c;学习一些课上没有涉及的内容。同时通过阅读一…

Docker容器:Centos7搭建Docker镜像私服harbor

目录 1、安装docker 1.1、前置条件 1.2、查看当前操作系统的内核版本 1.3、卸载旧版本(可选) 1.4、安装需要的软件包 1.5、设置yum安装源 1.6、查看docker可用版本 1.7、安装docker 1.8、开启docker服务 1.9、安装阿里云镜像加速器 1.10、设置docker开机自启 2、安…

关于 π 型技术人

T T 型人才的构建&#xff0c;犹如一把双刃剑&#xff0c;需要在两个维度上取得平衡。 横向要求“一” 在这个维度上&#xff0c;期望个体能够广泛涉猎各个领域&#xff0c;具备全面的知识面和通用素质。这意味着除了深厚的专业技能&#xff0c;也需要对其他相关领域有所了解…

【K8S 系列】认识k8s、k8s架构

一、什么是k8s? Kubernetes 简称 k8s&#xff0c;是支持云原生部署的一个平台&#xff0c;k8s 本质上就是用来简化微服务的开发和部署的&#xff0c;用于自动化部署、扩展和管理容器化应用的开源容器编排技术。对于传统的docker其实也提供了容器编排的技术docker-compose&…

centos卸载mysql库全流程

&#xff08;1&#xff09;暂停服务 systemctl stop mysqld &#xff08;2&#xff09;查看所有的安装包&#xff0c;将其卸载 rpm -qa |grep mysql rpm -q ( or --query) options -a 查询所有安装的软件包 &#xff08;3&#xff09;使用yum卸载安装的mysql [rootbo /…

华清远见嵌入式学习——QT——作业4

作业要求&#xff1a; 代码运行效果图&#xff1a; 代码&#xff1a; 头文件&#xff1a; #ifndef ALARMCLOCK_H #define ALARMCLOCK_H#include <QWidget> #include <QTimerEvent> #include <QTimer> #include <QTime> #include <QTextToSpeech&g…

Docker部署Nacos集群并用nginx反向代理负载均衡

首先找到Nacos官网给的Github仓库&#xff0c;里面有docker compose可以快速启动Nacos集群。 文章目录 一. 脚本概况二. 自定义修改1. example/cluster-hostname.yaml2. example/.env3. env/mysql.env4. env/nacos-hostname.env 三、运行四、nginx反向代理&#xff0c;负载均衡…

收款码在线生成系统源码/开源layui前端框架/附多套前端UI模板/三合一收款码生成系统源码

源码简介&#xff1a; 收款码在线生成系统源码&#xff0c;它是采用开源layui前端框架&#xff0c;并且它附多套前端UI模板&#xff0c;作为三合一收款码生成系统源码&#xff0c;界面简洁大方。 Layui前端的多合一收款码在线生成系统源码&#xff0c;附带了多套精美的前端UI…

EnlightenGAN论文阅读笔记

EnlightenGAN论文阅读笔记 论文是2019年IEEE的EnlightenGAN: Deep Light Enhancement without Paired Supervision.这篇论文是低光增强领域无监督学习的开山之作。 论文链接如下&#xff1a;arxiv.org/pdf/1906.06972.pdf 文章目录 EnlightenGAN论文阅读笔记出发点**出发点1**&…