举一个简单的例子,轻松搞懂所谓的“观察者模式”_观察者模式举例_仰望天花板的博客-程序员秘密

技术标签: javaEE互联网轻量级开发笔记  java  观察者模式  后端  设计模式  开发语言  

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

 看上面那些可能不太容易理解,简单举个例子,假如有一个产品列表,当这个产品列表更新的时候就会同步到一些电商平台,最简单的可能会用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();

    @Override
    public 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 {
    @Override
    public 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);

输出结果如下:

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_56058975/article/details/121844173

智能推荐

WebRTC源代码探索之旅——多线程篇(5 - 1)_kenny_zh的博客-程序员秘密

5 physicalsocketserver physicalsocketserver.h/physicalsocketserver.cc文件实现了一个基本的多路信号分离器。这个多路信号分离器的实现代码可以横跨Windows、Linux、OSX、Android、ios等平台,非常复杂。其实在/trunk/talk/base目录下,还有多个SocketServer的实现,从这些SocketS

OpenGL编程指南之阅读笔记 第三章 视图_Alarm2的博客-程序员秘密

先插一张图片 先解释一个函数 void gluLookAt(…) 里面记录三个位置,你的脑袋的位置,你看到的那一个物体的位置,你脑袋的朝向 函数干嘛的?你猜猜.当然是想把你看到的东西显示出来呀.

4、VC控制EXCEL的基本操作之选择范围篇_sxjlinux的博客-程序员秘密

选择篇1 选择单元格 //选择一个单元格range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("A1"))),TRUE); //选择多个单元格range.AttachDispatch(sheet.GetRange(COleVariant

POI 单元格垂直居中,相同内容的单元格合并_Nocturne2011的博客-程序员秘密

XSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 居中 cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);//垂直

C#中GroupBox控件的使用_c# groupbox 设置不可编辑_wangluojisuan的博客-程序员秘密

GroupBox(框架)控件是C#中用来组织其他控件形成一个控件组,它的使用方法为【工具箱】-》【所有Windows窗体】(或者是【容器】列表中)-》【GroupBox】,拖拽到窗体界面中,再将其他控件拖拽到GroupBox中就可以形成一个控件组。当框架移动时,该控件组同时移动,不会产生其他的位移,所以是组织界面的好东西。它主要有两个属性:Text和Visible。Text属性代表Grou

长白山 纯白世界爽酷无比_cjw8021的博客-程序员秘密

  正像夏季的阳光、海水、沙滩一样,冬季,雪原、滑雪、泡泉为出游最佳享受。你去过真正的雪乡吗?那一片纯白世界,美得让人心颤,而飞驰在雪原,感觉绝对酷毙了,像鸟一样轻盈、自由,其中的开心,非亲临者无法体会。   ...

随便推点

python一张纸折叠到珠峰高度_一张普通纸折叠27次后会是什么样?专家:厚度超过珠穆朗玛峰..._weixin_39687990的博客-程序员秘密

生活中,我们不伐有一些很简单的问题,但是这些简单的问题却含有复杂的解释过程,比如一张普通的A4纸,最多可以叠多少次?没有实践过的人会轻而易举的回答,叠很多次,其实不然,一张普通的A4纸最多可以叠8次,若是不信,可以自己去对叠一下。那么为什么一张纸最多只能叠8次,这其中含有一定的数学公式,假设纸为正方形,边长为a,厚度为h,当折叠一次的时候,折叠边长不变,厚度为2倍的h,折叠两次的时候,折叠边长为原...

application terminated怎么解决_Windows10 无法打开.exe可执行文件的解决方法_weixin_39731456的博客-程序员秘密

Windows10 无法打开.exe可执行文件的解决方法问题描述: 刚刚因为好奇使用福昕PDF编辑器打开.caj文件,但是一打开发现我好像中毒了,这边福昕不断的自动开启,而且可以看到我电脑上的应用都变成了福昕编辑器的图标。然后我还以为是系统出问题了,接着就是重启,但是重启之后发现,系统并没有恢复正常,福昕不但没有停止打开,而且比之前打开的更加多了,基于这个情况,我尝试打开其他软件,但是我发现双击...

饿了么el-upload自定义上传图片格式尺寸校验_el-upload 校验尺寸_闹闹的闹钟的博客-程序员秘密

&lt;el-upload class="avatar-uploader" accept="image/*" :http-request="(param) =&gt; uploadImage(param)" action="~~" :limit="1" ref="coverPicUpload" :show-file-list="false" :before-upload="beforeUpload"&gt; &lt;el-image style="width:.

Linux抓包命令集锦_182422883的博客-程序员秘密

相信抓包是程序员,运维工程师,架构师,都必不可少的一项技能。但是能够深入掌握好这门技艺的人,确实需要有开发,网络,运维,架构等&quot;跨界”背景才能比较好的发挥抓包神技的威力。本文是纯干货,重点不在于理论,更注重实战技能,尤其注重对抓包数据的分析。本文中的命令追求的是使用最简单,最普及的Linux系统自带工具包实现各种抓包分析,具有尽可能广泛的移植性和可用性。文中给出的命令均在Centos 6.3,tc...

tomcat错误:java.io.FileNotFoundException: Could not resolve XML resource [null] with public ID [null]_壹龙的博客-程序员秘密

关于web.xml中引用其它xml片段,然后运行在tomcat7.0.62上出现的问题具体做法如下: 1,按模块将servelet从web.xml中拷贝出来,放到一个test.xml中,如test.xml中内容如下: <servlet> <servlet-name>testA</servlet-name>

数据中台|宜信敏捷数据中台建设实践_weixin_34221036的博客-程序员秘密

【宜信技术沙龙】是由宜信技术学院主办的系列技术分享活动,活动包括线上和线下两种形式,每期技术沙龙都将邀请宜信及其他互联网公司的技术专家分享来自一线的实践经验,分享内容覆盖金融科技及软件研发等主要技术领域,旨在为金融科技行业提供可落地实践的解决方案,为金融科技从业者带来思路想法上的启发。【技术沙龙002期】数据中台:宜信敏捷数据中台建设实践|宜信技术沙龙 将于5月23日晚8点线上直播,点击报...

推荐文章

热门文章

相关标签