附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全:

书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈
①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版)
②【算法数据结构+acm】从入门到进阶吐血整理书单50+本(珍藏版)
③【数据库】从入门到进阶必读18本技术书籍网盘吐血整理网盘(珍藏版)
④【Web前端】从HTML到JS到AJAX到HTTP从框架到全栈帮你走更少弯路(珍藏版)   
⑤【python】书最全已整理好(从入门到进阶)(珍藏版)

⑥【机器学习】+python整理技术书(从入门到进阶已经整理好)(珍藏版)
⑦【C语言】推荐书籍从入门到进阶带你走上大牛之路(珍藏版)
⑧【安卓】入门到进阶推荐书籍整理pdf书单整理(珍藏版)

⑨【架构师】之路史诗级必读书单吐血整理四个维度系列80+本书(珍藏版)

⑩【C++】吐血整理推荐书单从入门到进阶成神之路100+本(珍藏)

【ios】IOS书单从入门到进阶吐血整理(珍藏版)

--------------------------------------------------------------------------------------------------------------------

写在前面:设计模式源于生活,而又高于生活!

什么是观察者模式

在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象收到通知并自动更新

其实就是发布订阅模式,发布者发布消息,订阅者获取消息,订阅了就能收到消息,没订阅就收不到消息。

观察者模式应用场景

Zookeeper事件通知节点、消息订阅通知、安卓开发事件注册

观察者模式原理类图

抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。

具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。

观察者模式实现方式一

抽象观察者

public interface ObServer {/*** 更新消息内容*/public void update(String message);}

抽象主题者

public interface AbstractSubject {/*** 添加obServer*/void addObServer(ObServer obServer);/*** 移除obServer*/void removeObServer(ObServer obServer);/*** 通知所有的notifyObServerAll*/void notifyObServerAll(String message);/*** 设置更新内容*/void setNtifyMessage(String message);}

具体主题

public class WeChatSubject implements AbstractSubject {/*** 存放所有的ObServer*/private List<ObServer> listObServer = new ArrayList<ObServer>();/*** 更新的内容*/private String message;public void addObServer(ObServer obServer) {listObServer.add(obServer);}public void removeObServer(ObServer obServer) {listObServer.remove(obServer);}public void notifyObServerAll(String message) {for (int i = 0; i < listObServer.size(); i++) {ObServer obServer = listObServer.get(i);obServer.update(message);}}public void setNtifyMessage(String message) {this.message = message;System.out.println("微信公众号设置message:" + message);notifyObServerAll(message);}
}

具体观察者

public class UserObServer implements ObServer {/*** 订阅者用户名称*/private String name;/*** 发送内容*/private String message;public UserObServer(String name) {this.name = name;}public void update(String message) {this.message = message;read();}public void read() {System.out.println(name + "同学收到推送消息:" + message);}
}

运行测试

public class App {public static void main(String[] args) {// 1.注册主题AbstractSubject weChatSubject = new WeChatSubject();// 2.添加观察者 订阅主题weChatSubject.addObServer(new UserObServer("小须"));weChatSubject.addObServer(new UserObServer("小霞"));// 3.设置发送消息weChatSubject.setNtifyMessage("消息内容:小须喜欢小霞");}
}

返回结果

微信公众号设置message:消息内容:小须喜欢小霞
小须同学收到推送消息:消息内容:小须喜欢小霞
小霞同学收到推送消息:消息内容:小须喜欢小霞

观察者模式实现方式二

JDK自带观察实现消息发送

(1). Observable类追踪所有的观察者,并通知他们。
(2). Observer这个接口看起来很熟悉,它和我们之前写的类几乎一样。

自定义主题

public class MessageObServable extends Observable {@Overridepublic void notifyObservers(Object arg) {// 1.改变数据setChanged();// 2.通知所有的观察者改变super.notifyObservers(arg);}
}

自定义观察者

public class EmailObServer implements Observer {public void update(Observable o, Object arg) {// 1.获取主题MessageObServable messageObServable = (MessageObServable) o;System.out.println("发送邮件内容:" + arg);}
}
public class SmsObServer implements Observer {public void update(Observable o, Object arg) {System.out.println("发送短信内容:" + arg);}
}

运行监听开始

public class JdkObServer {public static void main(String[] args) {//1.创建主题MessageObServable messageObServable = new MessageObServable();// 2.添加订阅者messageObServable.addObserver(new EmailObServer());messageObServable.addObserver(new SmsObServer());// 3.组装消息内容JSONObject jsonObject = new JSONObject();jsonObject.put("email", "11111111@qq.com");jsonObject.put("phone", "11111111111");jsonObject.put("text", "小须喜欢小霞.");messageObServable.notifyObservers(jsonObject.toJSONString());}
}

pom依赖

<dependencies><!-- fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.30</version></dependency>
</dependencies>

结果

发送短信内容:{"phone":"11111111111","text":"小须喜欢小霞.","email":"11111111@qq.com"}
发送邮件内容:{"phone":"11111111111","text":"小须喜欢小霞.","email":"11111111@qq.com"}

观察者模式实现方式三

Spring封装事件监听

OrderCreateEvent 

public class OrderCreateEvent extends ApplicationEvent {private JSONObject jsonObject;public OrderCreateEvent(Object source, JSONObject jsonObject) {super(source);this.jsonObject = jsonObject;}public JSONObject getJsonObject() {return jsonObject;}public void setJsonObject(JSONObject jsonObject) {this.jsonObject = jsonObject;}
}

EmailListener 

@Component
public class EmailListener implements ApplicationListener<OrderCreateEvent> {@Override@Asyncpublic void onApplicationEvent(OrderCreateEvent event) {System.out.println(Thread.currentThread().getName()+"发送邮件内容:" + event.getJsonObject().toJSONString());}
}

SmsListener 

@Component
public class SmsListener implements ApplicationListener<OrderCreateEvent> {@Override@Asyncpublic void onApplicationEvent(OrderCreateEvent event) {System.out.println(Thread.currentThread().getName() + "发送短信内容:" + event.getJsonObject().toJSONString());}
}

controller

@RestController
public class OrderController {@Autowiredprivate ApplicationContext applicationContext;@RequestMapping("/sendMsg")public String sendMsg() {// 3.组装消息内容JSONObject jsonObject = new JSONObject();jsonObject.put("email", "11111111@qq.com");jsonObject.put("phone", "11111111111");jsonObject.put("text", "小须喜欢小霞.");OrderCreateEvent orderCreateEvent = new OrderCreateEvent(this, jsonObject);applicationContext.publishEvent(orderCreateEvent);return "success";}
}

AppStart 

@SpringBootApplication
@EnableAsync
public class AppStart {public static void main(String[] args) {SpringApplication.run(AppStart.class,args);}
}

pom

  <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version></parent>
<dependencies><!-- fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.30</version></dependency><!-- SpringBoot-整合Web组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

结果输出

SimpleAsyncTaskExecutor-2发送短信内容:{"phone":"11111111111","text":"小须喜欢小霞.","email":"11111111@qq.com"}
SimpleAsyncTaskExecutor-1发送邮件内容:{"phone":"11111111111","text":"小须喜欢小霞.","email":"11111111@qq.com“}

522还不知道怎么表白吗?——经典设计模式之【观察者模式】相关推荐

  1. Spring源码学习笔记:经典设计模式之观察者模式

    1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 0.观察者模式(Observer Pattern) 观察者模式也叫发布订阅模式.定义了对象之间的一对多依赖,让 ...

  2. .net core 中的经典设计模式的应用

    .net core 中的经典设计模式的应用 Intro 前段时间我们介绍了23种设计模式,今天来分享一下 .net core 源码中我觉得比较典型的设计模式的应用 实例 责任链模式 asp.net c ...

  3. 23种经典设计模式都有哪些,如何分类?Java设计模式相关面试

    23种经典设计模式都有哪些,如何分类? 23种经典设计模式都有哪些,如何分类? java常用的设计模式?说明工厂模式 Java 中的23 种设计模式: Factory(工厂模式), Builder(建 ...

  4. JavaScript 经典设计模式

    文章出自个人博客https://knightyun.github.io/2021/01/17/js-design-pattern,转载请申明 设计模式(Design Pattern)是一套被反复使用的 ...

  5. java策略模式详解_Java经典设计模式之策略模式原理与用法详解

    本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式 ...

  6. Java 经典设计模式-- 03.结构型模式

    前言 书接上文,上一篇中创建型设计模式中的常用设计模式做了简单的介绍,本篇将继续对结构型设计模式中的常用模式进行介绍与分析. 目录: 适配器模式 桥接模式 组合模式 修饰模式 代理模式 简单提及: M ...

  7. 【十个】工资是职场最大的陷阱,可怕的是很多人还不知道……

    工资是职场最大的陷阱,可怕的是很多人还不知道-- 2018-03-08  为什么你的薪资一直不上不下?揭开职场薪资的十大秘密. 壹 陷阱:工资是职场最大的陷阱 实质:工资不是年薪不是月薪,而是时薪 朋 ...

  8. C++之23种经典设计模式(一)

    C++之23种经典设计模式(一) C++之23种经典设计模式(一) 单例模式(Singleton) 原型模式(Prototype) 工厂模式(Factory) C++之23种经典设计模式(一) 在偶然 ...

  9. 23种经典设计模式的原理、背后的思想、应用场景(下)

    对程序员来说,除了算法,设计模式也是提升代码能力的关键技能,今天我就想跟你聊聊 23种经典的设计模式. 23种经典设计模式共分为3种类型,分别是创建型.结构型和行为型.今天,我们把这3种类型分成3个对 ...

  10. 这些自动化测试框架知识你还不知道?

    这些自动化测试框架知识你还不知道?! 无论是在自动化测试实践,还是日常交流中,经常听到一个词:框架.之前学习自动化测试的过程中,一直对"框架"这个词知其然不知其所以然. 最近看了很 ...

最新文章

  1. Python爬取近十万条程序员招聘数据,告诉你哪类人才和技能最受热捧! | 原力计划...
  2. asp.net MVC中实现调取web api
  3. Problem A: 编写函数:三个数的最大最小值 (Append Code)
  4. Windows 技术篇-win+R运行搜索gpedit.msc提示“MMC 不能打开文件”解决方法
  5. ubuntu scp命令或者用root连接ssh提示:Permission denied, please try again.错误
  6. mysql迁移到mariadb_项目从MYSQL迁移至MARIADB教程
  7. mysql物理删除索引_Oracle与MySQL删除字段时对索引和约束的处理
  8. DataGridView
  9. 047、JVM实战总结:高级工程师的硬核技能:JVM的Full GC日志应该怎么看?
  10. paip.修复文件关联总结
  11. 第0课【课前准备】Keil安装 ISP程序下载
  12. matlab二阶系统的单位阶跃响应为,2 二阶系统阶跃响应
  13. 怎么解决mysql登录闪退问题
  14. 刷机后IMEI丢失如何能刷回来
  15. Win10笔记本电脑怎么直接重置初始化
  16. 毕设之 yolo5 航空影像飞行器检测
  17. 杂记之罗翔语录:要爱具体的人,而不要爱抽象的人
  18. ORACLE 根据分组排序产生序列号
  19. TypeScript技术知识整理
  20. 苹果电脑计算机无法启动,MacBook Pro 按开机按钮没反应无法开机

热门文章

  1. DevExpress 单元格的设置(可设字体、字号、前景色、背景色)
  2. S4 HANA CO和FI自动集成:成本中心分配分摊业务实践-KSV5/KSU5
  3. 抓包实现原理与反抓包
  4. php邮件发送可以发送图片吗,phpmailer发送图片
  5. 算法刷题记录(Day 73)
  6. 处理Nginx返回octet-stream数据流的配置
  7. matlab二次函数拟合,【长见识】matlab的二次函数拟合
  8. Impala graceful shutdown功能介绍
  9. PAT 1021 Deepest Root (25分) 从测试点3超时到满分再到代码优化
  10. Exp6 信息搜集与漏洞扫描 ——20164316张子遥