当前位置: 首页 > news >正文

设计模式之【观察者模式】

目录

观察者模式中的角色

通过一个简单案例来演示观察者模式

被观察者接口

事件类型

up主类作为被观察者

观察者接口

 粉丝类作为观察者

测试

测试结果


观察者模式中的角色

  • 被观察者(observable)
  • 观察者(observer)

通过一个简单案例来演示观察者模式

被观察者接口

/*** 被观察者*/
public interface Observable {/*** 添加观察者*/void addObserver(Observer observer);/*** 移除观察者*/void delObserver(Observer observer);/*** 通知观察者*/void advice(String msg, EventType eventType);
}

事件类型

/*** 事件类型*/
public enum EventType {NEW_COMPOSITION(1, "发布了新作品,点击查看新作品"),LIVE_BROADCAST(2, "正在直播中,前去观看");private final Integer key;private final String desc;EventType(Integer key, String desc) {this.key = key;this.desc = desc;}public Integer getKey() {return key;}public String getDesc() {return desc;}
}

up主类作为被观察者

import java.util.ArrayList;
import java.util.List;/*** up主(被观察者)*/
public class UpOwner implements Observable {// 维护一个观察者集合private final List<Observer> observers = new ArrayList<>();private final Integer id;private final String name;public UpOwner(Integer id, String name) {this.id = id;this.name = name;}@Overridepublic void addObserver(Observer observer) {if (!observers.contains(observer)) {observers.add(observer);}}@Overridepublic void delObserver(Observer observer) {observers.remove(observer);}@Overridepublic void advice(String msg, EventType eventType) {for (Observer observer : observers) {observer.take(msg, eventType);}}/*** 发布新作品*/public void uploadComposition() {advice(buildMsg(), EventType.NEW_COMPOSITION);}/*** 开始直播*/public void beginLive() {advice(buildMsg(), EventType.LIVE_BROADCAST);}public String buildMsg() {return String.format("您关注的up主[%s-%s]", getId(), getName());}public Integer getId() {return id;}public String getName() {return name;}
}

观察者接口

package sjms.observer;/*** 观察者*/
public interface Observer {/*** 被观察者执行的动作会触发该方法*/void take(String msg, EventType eventType);
}

 粉丝类作为观察者

/*** 粉丝(观察者)*/
public class Fan implements Observer {private final Integer id;private final String name;public Fan(Integer id, String name) {this.id = id;this.name = name;}@Overridepublic void take(String msg, EventType eventType) {System.out.println(this + "接收到消息:{" + msg + eventType.getDesc() + "}");}@Overridepublic String toString() {return "粉丝[" + id + "-" + name + ']';}
}

测试

public class MainTest {public static void main(String[] args) {// up主一UpOwner up = new UpOwner(0, "up主一");// 粉丝1、粉丝2、粉丝3Observer fan1 = new Fan(1, "fan1");Observer fan2 = new Fan(2, "fan2");Observer fan3 = new Fan(3, "fan3");// 粉丝1、粉丝2关注了up主一up.addObserver(fan1);up.addObserver(fan2);// 此时up主一发布一条新作品,粉丝1、粉丝2能收到信息并做出反应,粉丝3并没有关注up主一,所以收不到信息up.uploadComposition();System.out.println("------显眼的分界线------");// 粉丝1取关了up主一up.delObserver(fan1);// 粉丝3关注了up主一up.addObserver(fan3);// 此时up主一开启了直播,粉丝2、粉丝3能收到消息并做出反应,粉丝1已经取关了up主一,所以收不到消息up.beginLive();}
}

测试结果

http://www.lryc.cn/news/589826.html

相关文章:

  • 单片机(STM32-中断)
  • [2025CVPR-图像检索方向] COBRA:一种用于小样本自适应检索增强模型
  • 实训十一——网络通信原理
  • 震坤行获取商品SKU操作详解
  • LeetCode|Day15|125. 验证回文串|Python刷题笔记
  • C语言基础笔记——位操作
  • 虚幻引擎5 GAS开发俯视角RPG游戏 #06-7:无限游戏效果
  • 使用EF Core修改数据:Update方法与SaveChanges的深度解析
  • 前端性能追踪工具:用户体验的毫秒战争
  • Kiro:亚马逊云发布,革命性AI编程工具!以“规范驱动开发“重塑软件构建范式!
  • es启动问题解决
  • Java数据结构第二十五期:红黑树传奇,当二叉树穿上 “红黑铠甲” 应对失衡挑战
  • 树莓派系统安装
  • GENERALIST REWARD MODELS: FOUND INSIDE LARGELANGUAGE MODELS
  • Java对象的比较
  • 【ArcGISPro】修改conda虚拟安装包路径
  • C++ 计数排序、归并排序、快速排序
  • 图机器学习(10)——监督学习中的图神经网络
  • 【AI智能体】Dify 基于知识库搭建智能客服问答应用详解
  • AdsPower 功能详解 | 应用中心使用指南:插件统一管理更高效、更安全!
  • 医疗AI“全栈原生态“系统设计路径分析
  • Win11专业工作站版安装配置要求
  • 力扣每日一题--2025.7.16
  • MAC 苹果版Adobe Photoshop 2019下载及保姆级安装教程!!
  • 第六章 OBProxy 路由与使用运维
  • 【基于PaddlePaddle训练的车牌识别系统】
  • http协议学习-1
  • vue的provide和inject
  • 基于 Docker 环境的 JupyterHub 详细部署手册
  • 论文导读--PQ3D:通过分段级分组实现多模态特征融合和 MTU3D:在线查询表示学习与动态空间记忆