当前位置: 首页 > 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.dtcms.com/a/283449.html

相关文章:

  • 多维动态规划题解——不同路径【LeetCode】记忆化搜索
  • ai 编程工具,简单总结
  • 16路串口光纤通信FPGA项目实现指南 - 第二部分(下)
  • Day36 Java方法和流程控制练习 计算器
  • Linux运维新手的修炼手扎之第19天
  • Linux内核设计与实现 第1章:内核简介
  • UDP和TCP的主要区别是什么?
  • --- Bean 的生命周期 ---
  • Redis键过期后会立即删除吗
  • 光环效应(HALO Effect)
  • MySQL高并发高可用架构设计与实现:主从复制与读写分离
  • x86版Ubuntu的容器中运行ARM版Ubuntu
  • 3分钟实战!用DeepSeek+墨刀AI生成智能对话APP原型图
  • Karate(Java)接口自动化测试框架
  • 代码随想录算法训练营第五十天|图论part1
  • 【图像处理基石】如何入门人体关键点检测?
  • 迁移学习--基于torchvision中VGG16模型的实战
  • 【FreeRTOS#5】任务挂起与恢复实例
  • 信息收集知识总结
  • Git分支管理完全指南:从创建到合并与冲突解决
  • Java的Gradle项目,使用SLF4J+Log4j2+log4j2.xml
  • 深度隐匿源IP:高防+群联AI云防护防绕过实战
  • C++-linux系统编程 10.内核原理基础
  • 用python程序通过指纹识别开关车门
  • 开源 python 应用 开发(六)网络爬虫
  • 健康生活,从细节开始
  • 线程学习day1---基础知识+pthread_create、self、exit、cancle、join
  • pymongo库:简易方式存取数据
  • Android 15 Settings 搜索框增加暗码功能实现
  • Windows10系统上Node.js的安装及环境配置