设计模式--观察者模式
来源:互联网 发布:斩赤红之瞳黑瞳cos淘宝 编辑:程序博客网 时间:2024/05/21 12:49
观察者模式
场景
自从小张上次使用了策略模式,游戏增加了很多武器营收显著增加。产品部门计划增加游戏中用户之间的互动。如果用户关注了另一个用户,被关注用户有新的游戏动态,关注者会及时收到消息。
由于小张上次表现的不错,老王准备继续把这个重任交给小张。
小张的需求理解
这个需求,本质就是被关注者的最新动态要及时发送给关注者。小张仔细思考,发现这个需求和现实生活中订阅报纸的场景很相像。
现实生活中的订阅报纸
订阅报纸流程图:
小张这次没有着急开始编码,分析了需求并且找到了现实生活中的真实场景,回想起上次了解 策略模式时看到了设计模式的定义:
设计模式是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。
设计模式并不直接用来完成代码的编写,而是描述在各种不同情况下,要怎么解决问题的一种方案。设计模式能使不稳定依赖于相对稳定,具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变化的能力。
既然设计模式是反复出现问题的解决方案,那么现实生活中是否还有相同的业务场景。小张开始仔细思考现实生活中接触到的场景。
现实生活中的更多场景
- 微信订阅公众号
- 微信朋友圈(会看到好友的动态,并且可以屏蔽不看)
- 订阅博客
订牛奶
。。。。。
观察者模式
小张带着自己的思考,向经验丰富的老王求教。
老王:小张,现在进步很进步很快啊,这次这个需求在现实生活中有很多应用场景,观察者模式就是解决这个场景的方案。
小张:观察者模式?具体是如何实现的呢?
老王:小张啊,师傅领进门,修行看个人,既然你已经知道了需要用观察者模式来实现这个需求,那么就要利用网络的资源,去进行学习。
我们程序员需要学的东西很多,往往别人只能给你点拨一下,具体的了解还是要靠 百度,谷歌,stackoverflow来进行深入的学习,如果要系统的学习,你可以买上几本经典的书。
小张:明白,感谢王哥的指导。
小张开始在网络上疯狂的了解观察者模式,经过一个上午的了解,小张准备开始编码。
小张的实现
具体的代码
/** * 观察者接口 * 也就是这个场景的:关注者 */interface Observer{ public void follower(Subjetct subjetct);//关注 public void receiveDynamic(String message);//接受新的动态}/** * 主题接口 * 也就是这个场景的:被关注者 * 当它有新的动态会及时推送到它的关注者 */interface Subjetct{ List<Observer> observerList = new ArrayList<Observer>(); public void Follower(Observer observer);//增加关注者 public void haveNewDynamic(String message);//发送新的动态}/** * 关注者一 */class FollowerOne implements Observer{ private Logger logger = LoggerFactory.getLogger(FollowerOne.class); public void follower(Subjetct subjetct) { subjetct.Follower(this); } public void receiveDynamic(String message) { logger.info("关注者一收到了新的动态:"+message); }}/** * 关注者二 */class FollowerTwo implements Observer{ private Logger logger = LoggerFactory.getLogger(FollowerTwo.class); public void follower(Subjetct subjetct) { subjetct.Follower(this); } public void receiveDynamic(String message) { logger.info("关注者二收到了新的动态:"+message); }}/** * 主题实现 * 具体的一个对象 * 可以被关注,并且有新的动态会通知自己关注者 */class Followed implements Subjetct{ private Logger logger = LoggerFactory.getLogger(Followed.class); //private List<Observer> observerList = new ArrayList<Observer>(); public void Follower(Observer observer){ observerList.add(observer); } public void haveNewDynamic(String message){ logger.info("被关注着有新的动态:"+message); for(Observer observer :observerList){ observer.receiveDynamic(message); } }}/***测试类,看输出效果**/class ObserverTest{ public static void main(String[] args) { Subjetct subjetct = new Followed(); Observer followerone = new FollowerOne(); Observer followerTwo = new FollowerTwo(); followerone.follower(subjetct); followerTwo.follower(subjetct); subjetct.haveNewDynamic("我买了新的武器"); }}
类图
是否少了点什么
目前的实现,只能实现关注,但是如果关注者要取消关注呢?相信聪明的你是知道如何做的。(提供一点思路在主题接口,增加一个方法,能够从集合里移除关注者)
观察者模式
观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
要点
- 观察者模式定义了对象之间一对多的关系
- 主题(也就是可观察者)用一个共同接口来更新观察者
- 观察者与可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者接口
- 有多个观察者时,不可以依赖特点的通知次序
- swing大量使用观察者模式,许多GUI框架也是如此.
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- 设计模式-观察者模式
- 设计模式-【观察者模式】
- 设计模式-观察者模式
- 设计模式 -- 观察者模式
- 设计模式-观察者模式
- 【设计模式】观察者模式
- 设计模式- 观察者模式
- 设计模式- 观察者模式
- 设计模式--观察者模式
- 前端之js之深拷贝和浅拷贝
- TFS在项目中DevOps落地进程(下)
- 总浮动时间和自由浮动时间区别
- 处理ASP.NET Core中的HTML5客户端路由回退
- 设计事件驱动的微服务
- 设计模式--观察者模式
- 欢迎使用CSDN-markdown编辑器
- C语言从键盘输入一个十进制数将其转换为任意进制数输出
- 程序员必读:代码重构和交接的真谛
- Java应用——高仿Windows XP画板(一)
- CNN卷积神经网络
- 打印半边菱形
- JAVA中继承与初始化顺序
- Maven项目引入JS,css等文件的问题