资讯专栏INFORMATION COLUMN

自我理解-观察者(Observer)模式

xuweijian / 1298人阅读

摘要:观察者模式观察者模式也可以成为发布订阅模式,此模式是对象之间的模式,对象之间呈现一种一对多的关系。其中的一是被观察者,多是观察者,故被观察者不能产生多个对象,只能有一个对象供观察者观察,所以在写被观察者的时候,需要使用到单例模式。

观察者(Observer)模式

观察者(Observer)模式 也可以成为发布订阅模式,此模式是对象之间的模式,对象之间呈现一种一对多的关系。其中的一是被观察者,多是观察者,故被观察者不能产生多个对象,只能有一个对象供观察者观察,所以在写被观察者的时候,需要使用到单例模式。

代码理解

那么我们可以通过代码来很直观的理解观察者模式

package observer;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
//被观察者--产品列表
public class Products extends Observable {
    //产品列表
    private List proList = null;
    private static Products instance;
    //类唯一的实例(使用单例模式)
    private Products() {
        
    }
    //单例模式-获取列表对象
    public static Products getInstance() {
        if(instance == null) {
            instance = new Products();
            instance.proList = new ArrayList<>();
        }
        return instance;
    }
    /**
     * 增加观察者(电商接口)
     * @param observer 观察者
     */
    public void addProductsObserver(Observer observer) {
        this.addObserver(observer);
    }
    /**
     * 新增产品(被观察者)
     * @param newProduct 新产品
     */
    public void addProduct(String newProduct) {
        if(newProduct==null || "".equals(newProduct)) {
            System.out.println("未新增产品或新增产品为空!");
        }else {
            System.out.println("目前产品列表中有:"+proList.size()+"个产品!");
            //新增产品
            proList.add(newProduct);
            System.out.println("产品列表中新增了产品:"+newProduct);
            System.out.println("目前产品列表中有:"+proList.size()+"个产品!");
            //设置被观察者对象发生了变化(告知观察者,产品列表发生了变化)
            this.setChanged();
            //通知观察者,并传递新产品
            this.notifyObservers(newProduct);
        }
    }
}
package observer;
import java.util.Observable;
import java.util.Observer;
//观察者1-京东商城接口
public class JDObserver implements Observer {
    /**
     * 京东观察者接口
     * 1.Observable 被观察者
     * 2.product 产品
     */
    @Override
    public void update(Observable o, Object product) {
        Products pro = (Products) o;
        System.out.println("被观察者:"+ pro);
        String newProduct = (String) product;
        System.out.println("同步新产品【"+newProduct+"]到京东商城!");
    }
}
package observer;

import java.util.Observable;
import java.util.Observer;
//观察者
public class TaoBaoObserver implements Observer {
    /**
     * 淘宝观察者接口
     * 1.Observable 被观察者
     * 2.product 产品
     */
    @Override
    public void update(Observable o, Object product) {
        Products pro = (Products) o;
        System.out.println("被观察者:"+ pro);
        String newProduct = (String) product;
        System.out.println("同步新产品【"+newProduct+"]到京东商城!");
    }
}
结果测试

结果展示中,我们通过在列表中新增一个产品,然后来观察者和被观察者之间的变化,执行代码可得到以下结果:

新增一个产品:

产品为空:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69627.html

相关文章

  • 扔物线:给 Android 开发者的 RxJava 详解

    摘要:观察者模式面向的需求是对象观察者对对象被观察者的某种变化高度敏感,需要在变化的一瞬间做出反应。规定,当不会再有新的发出时,需要触发方法作为标志。在事件处理过程中出异常时,会被触发,同时队列自动终止,不允许再有事件发出。 我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使...

    tianren124 评论0 收藏0
  • 实现一个简单的Vue

    摘要:再获取其事件属性,我们这里只简单地获取属性,我们将它的属性值和元素标识保存到中最后等待模版挂载在元素中后,我们遍历数组,挂载事件至此,我的已基本实现了实现的是一个简单的计数器有兴趣的小伙伴可以复制以下代码运行查看效果 这周参考了一些博文,自己写了一个简单的vue,网上这类实现很多,我的实现也没什么新奇,权当一个自我练习吧 本文同时发在我的github博客上,欢迎star 具体实现 首先...

    roadtogeek 评论0 收藏0
  • 切图崽的自我修养-[MVVM] Js MV*模式浅谈

    摘要:在没有环境下对进行单元测试的时候,应用逻辑正确性是无法验证的更新的时候,无法对的更新操作进行断言。对是通过接口进行,在对进行不依赖环境的单元测试的时候。这里根据上面的例子给出了的单元测试样例。年微软工程师在自己的博客上首次公布了模式。 前言 做客户端开发、前端开发对MVC、MVP、MVVM这些名词不了解也应该大致听过,都是为了解决图形界面应用程序复杂性管理问题而产生的应用架构模式。网上...

    bluesky 评论0 收藏0

发表评论

0条评论

xuweijian

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<