版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

观察者模式概述

在正式进入该设计模式之前,我想问一下:你们平常都用微信干什么呢?

“聊天”
“发朋友圈”
“逛微店”
“看微信公众号,关注自己喜欢的内容”

好嘞,就从微信公众号入手!平常我们关注一个微信公众号,当它推送新内容时,手机界面上就会出现一个红色的小点提醒我们查看详细内容。换句话说:我们订阅了公众号,当它有新消息时就会自动告知我们。也就是说:我们自己是观察者,在观察微信公众号,微信公众号就是被观察者。

观察者模式的主要角色如下:

  • 抽象主题(Subject):该角色为抽象目标类(或接口),它是一个被观察者。该角色提供增加、删除观察者对象的抽象方法,以及通知所有观察者的抽象方法。
  • 具体主题(Concrete Subject):该角色是抽象主题(被观察者)的具体实现。
  • 抽象观察者(Observer):该角色是一个抽象类或接口,在该角色中包含接收到主题消息时的响应方法。
  • 具体观察者(Concrete Observer):该角色是抽象观察者的具体实现。

观察者模式示例

在此,以微信公众号为例阐述观察者模式。

抽象观察者

package com.observerPattern02;
/*** 原创作者:谷哥的小弟* 博客地址:http://blog.csdn.net/lfdfhl*/
public interface Observer {public void receiveMessage(String message);
}

具体观察者

package com.observerPattern02;
/*** 原创作者:谷哥的小弟* 博客地址:http://blog.csdn.net/lfdfhl*/
public class ObserverImpl implements Observer{private String name;public ObserverImpl(String name){this.name=name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void receiveMessage(String message) {System.out.println(name+",收到消息:"+message);}}

抽象主题

package com.observerPattern02;
/*** 原创作者:谷哥的小弟* 博客地址:http://blog.csdn.net/lfdfhl*/
public interface Subject {public void addObserver(Observer observer);public void deleteObserver(Observer observer);public void sendMessage(String message);
}

抽象的主题(被观察者)的常用方法:添加观察者,删除观察者,发送消息。

具体主题

package com.observerPattern02;
import java.util.ArrayList;
/*** 原创作者:谷哥的小弟* 博客地址:http://blog.csdn.net/lfdfhl*/
public class SubjectImpl implements Subject{private ArrayList<Observer> observerArrayList;public SubjectImpl(){observerArrayList=new ArrayList<Observer>();}@Overridepublic void addObserver(Observer observer) {if (observer!=null){observerArrayList.add(observer);}}@Overridepublic void deleteObserver(Observer observer) {if (observer!=null){observerArrayList.remove(observer);}}@Overridepublic void sendMessage(String message) {if(message!=null){for(Observer observer:observerArrayList){observer.receiveMessage(message);}}}
}

测试

package com.observerPattern02;
/*** 原创作者:谷哥的小弟* 博客地址:http://blog.csdn.net/lfdfhl*/
public class Test {public static void main(String[] args) {Subject subscription = new SubjectImpl();Observer observer1 = new ObserverImpl("老王");Observer observer2 = new ObserverImpl("小弟");Observer observer3 = new ObserverImpl("大熊");subscription.addObserver(observer1);subscription.addObserver(observer2);subscription.addObserver(observer3);subscription.sendMessage("公众号内容更新:最新动漫上线啦");}
}

嗯哼,看到了么?三个微信用户(观察者)都收到了微信公众号发布的消息。我们平常订阅微信公众号的本质是:微信公众号记录下我们的微信账号。所以,当它有新消息推送时瞅瞅自己的小本子上记录了谁就发送给谁。

小结

看完这个小例子,我们再来梳理一下观察者模式。

  • 该模式中存在观察者和被观察者
  • 观察者和被观察者通过订阅(例如:addObserver( ))发生关联关系
  • 当被观察者发出消息后,所有观察者均会收到消息

OK,当你看完了这个例子,再看RxJava框架的代码:

observable.subscribe(observer);

是不是就反应过来了呢?很多初学者看到这句代码的时候都会抓狂:怎么会是被观察者订阅了观察者?!!不该是观察者订阅被观察者么?!!其实,不必过于纠结文字表述的细节,重要的是明白其中的思想,它和我们刚才的:

subscription.addObserver(observer1);

难道不一样么?就是同一回事!没啥不同的。我们在思考问题的时候,不能单纯地只站在生活的角度来看,也不能光从计算机的角度来考虑;而是要把两者结合起来,不要钻牛角尖,认死理。

感悟

很多刚开始做开发的童鞋喜欢拿着一本厚厚的设计模式在角落里默默地啃。学习的劲头很足,态度也很端正,配得上10086个赞。在此,我也想提醒一下小伙伴们:学习态度和努力程度固然非常重要,但是我们也要注意学习方法。抛开实际应用和业务逻辑单纯地看设计模式是很难理解其精髓的。我们不妨将设计模式和自己的实际工作结合起来学习,从理论到实践,从书本到实战。

有趣的设计模式——微信公众号中蕴藏的观察者模式相关推荐

  1. python微信公众号翻译功能怎么用_Watson使用指南(七)在微信公众号中实现识图作诗功能...

    本文章主要是写一下这个项目开发的过程及之间遇到的问题,作为记录,也希望以此为契机认识志同道合的朋友,一起学习交流. 目录: 概述 环境准备及相关账号申请 部署Python Flask应用到Bluemi ...

  2. python获取藏头诗内容_Watson使用指南(六)在微信公众号中实现识图作诗功能

    本文章主要是写一下这个项目开发的过程及之间遇到的问题,作为记录,也希望以此为契机认识志同道合的朋友,一起学习交流. 目录: 概述 环境准备及相关账号申请 部署Python Flask应用到Bluemi ...

  3. Watson使用指南(六)在微信公众号中实现识图作诗功能

    本文章主要是写一下这个项目开发的过程及之间遇到的问题,作为记录,也希望以此为契机认识志同道合的朋友,一起学习交流. 目录: 概述 环境准备及相关账号申请 部署Python Flask应用到Bluemi ...

  4. php怎么添加会员卡,怎么在微信公众号中添加一个会员卡领取功能

    怎么在微信公众号中添加一个会员卡领取功能 发布时间:2020-12-09 16:06:27 来源:亿速云 阅读:129 作者:Leah 这篇文章将为大家详细讲解有关怎么在微信公众号中添加一个会员卡领取 ...

  5. php 微信开发 菜单,微信公众号中个性化菜单的开发实例

    微信公众号中个性化菜单的开发实例 个性化菜单让公众号的不同用户群体看到不一样的自定义菜单.该接口开放给已认证订阅号和已认证服务号,个性化菜单要求用户的微信客户端版本在iPhone6.2.2,Andro ...

  6. 基于WeX5平台开发微信公众号中的在线问卷调查

    在线调查问卷在我们的生活中应用的非常广泛,能够非常方便快捷的获取到我们需要的信息,统计分析出相关核心的数据,方便我们的决策.在微信发展迅速的时代,覆盖面非常的大,那么基于微信公众号去推送我们的在线问卷 ...

  7. 微信公众号服务器端脑图,微信公众号中隐藏的思维导图工具,帮你随时随地高效思考...

    「有什么好用的思维导图工具推荐呢?」后台里收到了很多小伙伴类似的问题. 事实上,市面上的思维导图工具真的非常多.无论是老牌的 XMIND,还是在线版的 百度脑图或者 ProcessOn 都可以帮你制作 ...

  8. Vue 开发在微信公众号中如何文件下载

    通常我们调用下载接口时,我们需要根据后端提供的接口返回信息进行相应的处理操作. 1.接口返回 文件路径(部分). window.open('http://192.168.22.246:8080'+ f ...

  9. 微信公众号中的支付宝支付与微信支付 支付宝支付问题(微信bug)

    一般,在微信公众号中的商城都是需要支持微信支付和支付宝支付的,当然,较大的公司对于鹅厂和阿里的站队就不说了,所以这里简单记录一下支付宝支付和微信支付的主要流程.说是简单介绍,这是因为确实不难,因为前端 ...

最新文章

  1. 【React踩坑记一】React项目中禁用浏览器双击选中文字的功能
  2. php求数组的长度的函数,php如何计算数组长度?
  3. 下采样downsample代码
  4. es6 --- forEach的实现
  5. bash/shell编程学习(2)
  6. 安装百分之80卡住_新车买回来要不要安装发动机护板呢
  7. ubuntu 设置静态路由_Linux系统添加永久静态路由的方法
  8. 几个年薪百万的下属,爆了~
  9. java system.gc不会立即执行_(转)调用System.gc没有立即执行的解决方法
  10. 英伟达用GAN生成脑瘤图像,训练出的AI医生,准确率提高16%
  11. 可视化数据图表制作注意事项
  12. 开源ITIL框架 php,分享|如何在 CentOS 7 上安装开源 ITIL 门户 iTOP
  13. 2022-2028全球针织捆包网行业调研及趋势分析报告
  14. rpm -ivh安装mysql_RPM 命令详细介绍
  15. php-screw 安装,php源码加密:php_screw 安装与使用
  16. 众数问题c语言编程,众数问题
  17. html基础、h5c3高级c3动画 、 JavaScript初高级、css预处理器和git 部分面试题
  18. 知识图谱嵌入(KGE)主流模型简介
  19. CSS实现登录表单毛玻璃效果
  20. 06_[nvim0.5+从0单排]_Native LSP 自动补全、语法检查、code action、代码段—TypeScript篇

热门文章

  1. 什么是机器学习?机器学习与AI的关系?
  2. Hive Serde
  3. VMware: vmw_ioctl_command error 无效的参数.
  4. 外贸沟通谈判中加分项,这些你都知道吗?
  5. 从数字企业转型来看,数据分析能带来什么
  6. 微信云开发——日记小程序
  7. 天梯赛 L1-054 福到了 (15 分) C++
  8. VSCode常用插件和字体设置
  9. 一佳门户多商户多行业v3.0.0
  10. 做站群需要多少站点?