什么是观察者?

某天何小喵跟小西贝一起动物园去看动物,看到一群熊猫,在吃竹子,我们发现觉得很可爱,拍照发朋友圈

  • 何小喵小西贝:观察者
  • 熊猫:被观察者
  • 吃竹子:动作触发
  • 拍照发朋友圈:事件

整体来说,观察者要等待被观察者做出动作,然后进行触发。

实现观察者设计

接下来我们以一个实战场景为例,发送短信。

其实可以用工厂模式+观察者+构建模式,进行设计,不过要以场景为主,不要为了设计模式而设计

首先我们定义个主体接口

主要是用一个来控制触发事件,观察者都需要添加进去,可以把主体比作被观察(当成熊猫,然后熊猫吃竹子,然后通知观察者

package com.binglian.message;/*** 发送观察者主体对象,其他观察者,需要添加进去*/
public interface Subject {/*** 订阅操作,添加观察者** @param observer*/void addSubscribe(Observer observer);/*** 取消订阅操作** @param observer*/void deletedSubscribe(Observer observer);/*** 触发动作,通知观察者*/void notifyTrigger();}

实现一个主体

实现发送主体(主要用于发送消息,而观察者就是发送到哪里)

package com.binglian.message.impl;import com.binglian.message.Observer;
import com.binglian.message.Subject;import java.util.ArrayList;
import java.util.List;/*** 实现主体方法,短信发送主体*/
public class SendSubject implements Subject {/*** 存储观察者对戏*/private List<Observer> observerList = new ArrayList<>();@Overridepublic void addSubscribe(Observer observer) {observerList.add(observer);}@Overridepublic void deletedSubscribe(Observer observer) {observerList.remove(observer);}@Overridepublic void notifyTrigger() {for (Observer observer : observerList) {observer.doEvent();}}
}

实现两个观察者

两个观察者,就是观察主体的情况,如果主体(熊猫发生了动作),就触发观察者(触发已经添加的观察者),

  • 一个是阿里短信发送
  • 一个是邮箱发送

首先定义一个观察者的接口(规范观察者)

package com.binglian.message;/*** 观察者,接口规范,让其他对象实现***  观察者*/
public interface Observer {/*** 接收到触发条件,事件*/public void doEvent();
}

这里用了拍照日志输出,而不是用短信发送,这样更贴近最上面的图片

package com.binglian.message.impl;import com.binglian.message.Observer;
import lombok.extern.slf4j.Slf4j;/*** 阿里短信观察者*/
@Slf4j
public class AlibaObserver implements Observer {@Overridepublic void doEvent() {log.info("拍照发朋友圈");}
}

邮箱发送观察者(把比作何小喵,她来发邮件)

package com.binglian.message.impl;import com.binglian.message.Observer;
import lombok.extern.slf4j.Slf4j;/*** 邮箱发送*/
@Slf4j
public class EmailObserver implements Observer {@Overridepublic void doEvent() {log.info("邮箱发送");}
}

观察者调用

首先我们定义一个main方法,调用观察者设计

  • 1、实例化一个发送主体,把观察者都添加进去。
  • 2、然后我们先新增一个观察者(小西贝,拍照发朋友圈),添加到主体实现类。
  • 3、熊猫吃竹子,自动触发,通知观察者,输出”拍照“(因为只添加一个小西贝)。
  • 4、在添加一个观察者(何小喵),她来发邮箱。
package com.binglian.message;import com.binglian.message.impl.AlibaObserver;
import com.binglian.message.impl.EmailObserver;
import com.binglian.message.impl.SendSubject;public class Main {//  这里可以用其他形式public static Subject subject = new SendSubject();public static void main(String[] args) {//  新增观察者AlibaObserver alibaObserver = new AlibaObserver();subject.addSubscribe(alibaObserver);//  熊猫吃竹子了,触发事件subject.notifyTrigger();//  在增加一个邮箱System.out.println("------------新增一个观察者-------------");EmailObserver emailObserver = new EmailObserver();subject.addSubscribe(emailObserver);//  再次触发subject.notifyTrigger();}
}

小西贝、何小喵看熊猫之观察者设计模式相关推荐

  1. 绿茶餐厅拟上市:年收入16亿,连续3年盈利,次于西贝和九毛九

    3月30日,港交所披露的文件显示,绿茶餐厅母公司绿茶集团有限公司(下称"绿茶集团")向港交所递交上市申请,并披露了招股书. 根据介绍,绿茶集团起步于2004年在杭州西湖景区设立的绿 ...

  2. 残酷!西贝一哭就有贷款,路边烧烤店想融资,还需国企员工担保

    残酷!西贝一哭就有贷款,路边烧烤店想融资,还需国企员工担保 来源 | 新流财经 作者 | 小慧吖 受疫情影响,西贝餐饮集团创始人贾国龙接受媒体访问"叫苦"现金流只能撑过3个月,引发 ...

  3. 【小西】同步咪咕订单给咪咕方(写接口给第三方)

    同步咪咕订单给咪咕方 前言 思路 实现 1.定义请求体和响应信息 MiGuOrderSyncReq MiGuOrderSyncResp 2.nacos定义好咪咕相关配置信息 3.同步咪咕参数配置 4. ...

  4. 小编带你两图看清北京大厂公司、码农分布——谷歌,微软,百度,腾讯,阿里,滴滴,美团,头条,独角兽

    小编带你两图看清北京大厂公司.码农分布--谷歌,微软,百度,腾讯,阿里,滴滴,美团,头条 ​ 北京一二线大厂公司.码农分布 年关将至,意味着2021年即将过去,2022年即将到来 现在,就是大家开始为 ...

  5. 微信小程序开发多少钱 怎么看价格成本

    按照功能来看,很多人还是感觉app功能会比较全面,但是小程序的功能也逐渐完善,就开发和维护成本来看,也是小程序受欢迎的原因之一.有些不可替代的事实不得不承认,APP游戏是小程序"玩" ...

  6. 小西的快乐乘法表(想不到怎么做到同时输入两个数,并同时输出两张乘法表,求助)

    我只能写出输出一个乘法表的代码,在下面 9月10号!新生小西高兴的走到广西大学,看到了正门的十二根柱子,突然想开始背诵乘法表! 不过小西已经是大学生了!所以想背任意前A行乘法表! Input 输入多行 ...

  7. 小娴的男友小旭不幸患了一种怪病,这种怪病吞噬了他的大部分记忆,同时让他突然间不会书写符合正确语序的英文。神奇的是,虽然他写出的句子看上去杂乱无章,不过经过仔细分析可以发现,如果把单词的顺序倒过来,语法

    题目描述 小娴的男友小旭不幸患了一种怪病,这种怪病吞噬了他的大部分记忆,同时让他突然间不会书写符合正确语序的英文.神奇的是,虽然他写出的句子看上去杂乱无章,不过经过仔细分析可以发现,如果把单词的顺序倒 ...

  8. 火山小视频消重复技巧 怎么看视频md5

             火山小视频消重复技巧 怎么看视频md5          那么在抖音投放广告的费用需要多少呢?A5抖音广告平台提示您:抖音广告费用通常按照达人的粉丝数量.获赞数量,视频播放数量,以及 ...

  9. 以微信小程序相册为例,看Serverless DevOps最佳实践

    导语 | 近日,云+社区技术沙龙"高效智能运维"圆满落幕.本期沙龙围绕运维展开了一场技术盛宴,从AIOps.Serverless DevOps.蓝鲸PaaS平台.K8S等分享关于业 ...

最新文章

  1. docker部署xxl-job 通用反射执行器
  2. 软件开发质量控制-CMMI读后疑问
  3. linux问题排查常用命令详解
  4. Node的异步与java的异步_node.js和异步编程回文
  5. 仿微软Office 迷你工具条(简易编辑器)
  6. lisp语言100以内勾股数_三个视频搞定:函数的最值、对勾函数、分式函数性质与图像、分段函数最值...
  7. MAC 打开safari和Chrome打开开发者工具的快捷键
  8. matlab 工具函数 —— normalize(归一化数据)
  9. LNMP建站分离部署
  10. 点击微信网页的a标签直接跳转到淘宝APP打开怎么实现的?附:动图演示效果
  11. Race Condition是什么
  12. ENSP-----ISIS协议
  13. Js 摄氏度和华氏度的转换
  14. es文件搜索不到win7服务器,ES文件浏览器Win7局域网共享错误解决方案
  15. 室内地图导航应用小程序-前端知识体系图
  16. webp图片介绍及用法总结
  17. JavaScript(JS) date.getDay()
  18. 剪辑视频的方法有哪些
  19. Redhat Linux 5.3环境实施DB2 V9.7 HADR
  20. 微信小程序有哪些?401~500

热门文章

  1. mysql索引怎么设计,MySQL如何设计索引
  2. 有人离职,工作交接不下去,咋整?
  3. 用VScode编写LaTex-最新教程2022/4/17
  4. NESASM教程——第八天——比较
  5. 微信公众号开发官方定制ui
  6. leg引擎适合什么系统的服务器,开区技术发布LEG引擎服务端武器升级的方法
  7. Android studio -添加背景图
  8. 【算法系列】非线性最小二乘求解-梯度下降法
  9. JavaScript竞彩篮球投注,注数和最高奖金的算法
  10. 程序员完全没时间提升自己该怎么办?