观察者模式又称为发布订阅模式,是对象的行为模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监视着被观察者的状态,当被观察者的状态发生变化时,会通知所有观察者,并让其自动更新自已。

看上面那些可能不太容易理解,简单举个例子,假如有一个产品列表,当这个产品列表更新的时候就会同步到一些电商平台,最简单的可能会用if进行判断,当产品列表更新就同步,例如下图:

按照这种方法,如果还有其他电商合作,那么还要继续在if语句里增加逻辑。首先,如果多达数百家电商,那么if的逻辑就异常复杂了。如果推送商品给淘宝发生异常,需要捕捉异常,避免影响之后的电商接口,导致其不能往下进行,这样代码耦合就会增多,同时也不利于维护和扩展

在现实中对开发团队而言,可能产品库是产品团队维护,而合作的电商又是电商团队在维护,这样两个团队之间又要维护同一段代码,显然会造成责任不清的问题。

1.观察者模式

它更容易扩展,责任更加清晰,我们把电商看成是一个观察者而产品列表就是被观察者对象(被观察者),每一个观察者都可以观察到被观察者,当产品列表更新就会触发各个电商接口发送新产品到合作电商

这种一个或者多个对象(电商接口)去监视另一个对象(产品列表)就被称为观察者模式

观察者模式要同时存在观察者和被观察者双方,观察者可以是多个,

2.被观察者

被观察者需要继承java.util.Observable类

package observer;import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;public class ProductList extends Observable {private List<String>productList =null;//产品列表private static ProductList instance=null;//类唯一实例private ProductList(){};//构建方法私有化//取唯一实例public static ProductList getInstance(){if (instance==null){instance=new ProductList();instance.productList=new ArrayList<>();}return instance;}/*** 增加观察者对象(电商接口)* observer观察者*/public void addProductListObservable(Observer observer){this.addObserver(observer);}/*** 增加商品* newProduct新产品*/public void addNewProduct(String newProduct){productList.add(newProduct);System.out.println("增加新产品");this.setChanged();//设置被观察者(产品列表)发生变化this.notifyObservers(newProduct);//通知电商接口(观察者)发生变化}}

构建方法私有化,避免通过new的方式创建对象,而是通过getInstance方法获得产品列表单例,这里使用的是单例模式。

addProductListObserver可以增加一个电商接口(观察者)。
核心逻辑在 addProduct 方法上。在产品列表上增加了一个新的产品,然后调用setChanged方法。这个方法用于告知观察者当前被观察者发生了变化,如果没有,则无法触发其行为。最后通过notifyObservers告知观察者,让它们发生相应的动作,并将新产品作为参数传递给观察者。

3.观察者

观察者需要实现java.util.Observer接口的update方法,如下代码:

package observer;import java.util.Observable;
import java.util.Observer;public class JingDongObserver implements Observer {ProductList productList=ProductList.getInstance();@Overridepublic void update(Observable o, Object product) {String newProduct=(String)product;System.out.println("增加新产品同步到京东"+product);}
}
package observer;import java.util.Observable;
import java.util.Observer;public class TaoBaoObserver implements Observer {@Overridepublic void update(Observable o, Object product) {String newProduct=(String)product;System.out.println("发布新产品同步到淘宝"+product);}
}

开启测试:

package observer;import java.util.Observable;
import java.util.Observer;public class ObserverTest {public static void main(String[] args) {ProductList productList=ProductList.getInstance();//获得被观察者唯一对象JingDongObserver jingDongObserver=new JingDongObserver();TaoBaoObserver taoBaoObserver=new TaoBaoObserver();productList.addObserver(taoBaoObserver);//addObserver被观察者(产品列表)注册观察者productList.addObserver(jingDongObserver);productList.addNewProduct("新增产品");}
}

4.被观察者注册到观察者

重点是被观察者(产品列表)需要注册到观察者,这样观察者才能观察到被观察者

productList.addObserver(taoBaoObserver);
//addObserver被观察者(产品列表)注册观察者productList.addObserver(jingDongObserver);

输出结果如下:

增加新产品
增加新产品同步到京东新增产品
发布新产品同步到淘宝新增产品

举一个简单的例子,轻松搞懂所谓的“观察者模式”相关推荐

  1. 【机器学习sklearn】两个例子轻松搞懂核密度估计KernelDensity

    前言 作业中遇到了需要使用KernelDensity的情况,但是网上的资料参差不齐,找了不短的时间却失望而归,最后还是靠着自己的理解才弄懂sklearn这个函数的使用,特此纪念. [机器学习sklea ...

  2. android 观察者模式的简单demo,一个简单的demo彻底搞懂观察者模式

    介绍 观察者模式也被称为发布-订阅(Publish/Subscribe)模式,它属于行为型模式的一种.观察者模式定义了一种一对多的依赖关系,一个主题对象可被多个观察者对象同时监听.当这个主题对象状态变 ...

  3. java 点击一下左边按钮_右边显出一列表_举个例子_java椭圆按钮怎么设置,最好举一个简单的例子,只要有窗体中一个椭圆按钮就可以,最好有注释,谢谢,好的...

    匿名用户 1级 2010-12-14 回答 椭圆按钮要重新绘制按钮才行,对你来说可能会比较难. import javax.swing.ImageIcon; import javax.swing.JBu ...

  4. 【轻松搞懂设计模式】观察者模式

    [设计模式]观察者模式 前言 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.这种模式有时又称作发布-订阅 ...

  5. java继承类型转换_#java 一个简单的例子理解java继承、成员函数重写、类型转换...

    一个简单的例子理解java继承.成员函数重写.类型转换 1.继承简介 举一个简单的例子:笔分为很多种,比如毛笔.钢笔.圆珠笔等等,这些笔都有一些相同的属性比如长度.笔迹的粗细等等:但他们也有不同的特点 ...

  6. 量子计算机迷宫,一个简单的例子,带你读懂量子计算机

    原标题:一个简单的例子,带你读懂量子计算机 量子计算机和你的笔记本电脑在本质上是一样的,使用的都是二进制编码.计算机语言只用0和1来表达,这被称为"位",是计算机信息量最小的单位. ...

  7. 抽象语法树 c语言,一个简单的例子看懂抽象语法树的魔力

    在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示.它以树状的形式表现编程语言的语法结构,树上的每个 ...

  8. proe常用c语言语句,带你轻松搞懂Proe条件语句

    原标题:带你轻松搞懂Proe条件语句 本文通过几个简单的例子介绍Proe中的条件语句,希望对你能有所帮助.Proe中使用的IF条件语句和C语言中的IF语句原理是一样的,其结构稍有差别.首先我们了解一下 ...

  9. php service原理,轻松搞懂WebService工作原理

    用更简单的方式给大家谈谈WebService,让你更快更容易理解,希望对初学者有所帮助. WebService是基于网络的.分布式的模块化组件. 我们直接来看WebService的一个简易工作流程: ...

  10. 在matlab中怎么录制音频_怎么录制淘宝页面中的视频?简单方法,轻松搞定

    原标题:怎么录制淘宝页面中的视频?简单方法,轻松搞定 怎么录制淘宝页面中的视频?当前足不出户,大家就可以在很多的电商平台购买到自己心仪的商品.这其中商机也就产生了,如果不太想上班,或者说想要自己当老板 ...

最新文章

  1. sudo apt get linux,常用sudo apt-get命令
  2. Golang mysql数据库
  3. Java-代理模式的理解
  4. PHP实现多服务器session共享之NFS共享
  5. Android N 新特性 + APP开发注意事项
  6. git 多用户多仓库配置
  7. simulink 分析达芬方程
  8. 认知NumPy数学运算库
  9. L2-015 互评成绩(排序)
  10. python之featVec[:axis]|extend|append
  11. 什么是DVD?DVD有些格式?
  12. 传感器系列(一)——超声波测距传感器 HC—SR04模块
  13. python判断邮箱格式是否正确_python:校验邮箱格式
  14. Vue项目关闭语法检查
  15. R语言之一元线性回归xt2.15
  16. 给大家普及呼叫中心和电话营销系统相关知识--中继线路
  17. 漫威联手六位中国运动员致敬漫威电影宇宙十年
  18. GIS矢量数据更新时的瓦片范围计算
  19. web前端之百度首页仿写
  20. 论文总结-交通预测(未完成)

热门文章

  1. gcc不是一个人在战斗,了解EFF文件格式
  2. 什么是BPM系统?BPM流程管理系统介绍
  3. 迅捷PDF转换器怎样转换文件格式
  4. 迅捷pdf转换器——如何提取pdf中的图片
  5. Android 系统(93)---android 怎么判断手机号是移动还是联通还是电信
  6. window下解压tar.gz.part-*文件
  7. 宅男也可变形男-我是如何在11个月零27天减掉80斤的
  8. 基于jQuery/express/socket.io实现的匿名聊天室
  9. 指纹存取控制系统的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. React全家桶写一个CNode社区