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

设计模式—行为型模式之观察者模式

设计模式—行为型模式之观察者模式

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。这是一种对象行为型模式。

观察者模式有如下角色:

  • Subject: 目标

  • ConcreteSubject: 具体目标

  • Observer: 观察者

  • ConcreteObserver: 具体观察者

示例

比如现在大火的主播,可以直播卖货,直播卖货时可以通知给粉丝,结束卖货时也可以通知给粉丝。我们可以在主播中维护一个粉丝的列表,来进行通知。

代码如下:

/*** 抽象主播类*/
public abstract class AbstarctAnchor {//添加粉丝abstract void addFans(AbstarctFans fans);//通知粉丝abstract void notifyFans(String msg);}/**
抽象粉丝类*/
public abstract class AbstarctFans {//接收消息abstract void acceptMsg(String msg);//关注主播public void follow(AbstarctAnchor anchor){anchor.addFans(this);}
}

卖奥特曼的主播为:

/*** 卖奥特曼的主播*/
@Slf4j
public class SellingUltramanAnchor extends AbstarctAnchor{//粉丝列表private List<AbstarctFans> fansList = new ArrayList<>();//卖奥特曼public void selling(){log.info("我是卖奥特曼的主播,我来卖奥特曼了....");//通知粉丝notifyFans("主播来卖货了");}//结束卖奥特曼public void end(){log.info("奥特曼卖没了....");//通知粉丝notifyFans("主播结束卖货了");}@Overridevoid addFans(AbstarctFans fans) {fansList.add(fans);}@Overridevoid notifyFans(String msg) {//获取所有粉丝进行通知for (AbstarctFans abstarctFans : fansList) {abstarctFans.acceptMsg(msg);}}
}

忠实粉丝和黑粉类如下

/*** 忠实粉丝*/
@Slf4j
public class LoyalFans extends AbstarctFans{@Overridevoid acceptMsg(String msg) {log.info("卖奥特曼的主播来了,他说:"+msg);}
}
/*** 黑粉*/
@Slf4j
public class AntiFan extends AbstarctFans{@Overridevoid acceptMsg(String msg) {log.info("这个卖奥特曼的主播卖的奥特曼不会发光,别买!!!");}
}

测试类如下

public class ObserverTest {public static void main(String[] args) {//卖奥特曼的主播对象SellingUltramanAnchor anchor = new SellingUltramanAnchor();//忠实粉丝1AbstarctFans loyalFans1 = new LoyalFans();loyalFans1.follow(anchor);//忠实粉丝2AbstarctFans loyalFans2 = new LoyalFans();loyalFans2.follow(anchor);//黑粉AbstarctFans antiFan = new AntiFan();antiFan.follow(anchor);//开播anchor.selling();//结束直播anchor.end();}
}

运行结果如下:

运行截图

相关文章:

  • 每日一题——LeetCode1304.和为零的N个不同整数
  • 本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面
  • 一个golang小白使用vscode搭建Ununtu20.04下的go开发环境
  • HCIA vlan练习
  • Maven排除依赖 exclusions
  • 带大家做一个,易上手的家常葱爆牛肉
  • MacOS受欢迎的数据库开发工具 Navicat Premium 15 中文版
  • 二进制部署高可用k8s集群V1.20.11版本
  • nginx 搭建docker 似有hub仓库
  • SqlAlchemy使用教程(五) ORM API 编程入门
  • MetaGPT-打卡-day2,MetaGPT框架组件学习
  • 网络安全概述
  • 旧路由重置新路由设置新路由设置教程|适用于自动获取IP模式
  • C#调用Newtonsoft.Json将bool序列化为int
  • HttpServletRequest getHeader、getHeaders、getIntHeader、getDateHeader区别
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • css系列之关于字体的事
  • echarts花样作死的坑
  • Hexo+码云+git快速搭建免费的静态Blog
  • Java多线程(4):使用线程池执行定时任务
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • PAT A1050
  • uva 10370 Above Average
  • 彻底搞懂浏览器Event-loop
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于HAProxy的高性能缓存服务器nuster
  • 记一次删除Git记录中的大文件的过程
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 听说你叫Java(二)–Servlet请求
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #QT项目实战(天气预报)
  • #前后端分离# 头条发布系统
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言)fread与fwrite详解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)大型网站架构演变和知识体系
  • .net 4.0发布后不能正常显示图片问题
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net Web窗口页属性
  • .NET命令行(CLI)常用命令
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • /bin/bash^M: bad interpreter: No such file or directory
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [\u4e00-\u9fa5] //匹配中文字符
  • [20150904]exp slow.txt
  • [20160902]rm -rf的惨案.txt