观察者(Observer)模式

    xiaoxiao2025-06-03  85

    文章目录

    观察者(Observer)模式被观察者观察者测试这两个观察者 和 产品列表的被观察者:

    观察者(Observer)模式

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

    被观察者

    被观察者需要继承Observable类。调用addObserver方法,添加观察者。调用setChanged方法,用于告知观察者当前被观察者发生了变化,如果没有,则无法触发其行为。notifyObservers告知观察者,让它们发生相应的动作,并将新产品作为参数传递给观察者。 package com.lean.ssm.chapter2.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;//类唯一实例 private ProductList() {}//构建方法私有化 /** * 取得唯一实例 * @return 产品列表唯一实例 */ public static ProductList getInstance() { if (instance == null) { instance = new ProductList(); instance.productList = new ArrayList<String>(); } return instance; } /** * 增加观察者(电商接口) * @param observer 观察者 */ public void addProductListObserver(Observer observer) { this.addObserver(observer); } /** * 新增产品 * @param newProduct 新产品 */ public void addProudct(String newProduct) { productList.add(newProduct); System.err.println("产品列表新增了产品:"+newProduct); this.setChanged();//设置被观察对象发生变化 this.notifyObservers(newProduct);//通知观察者,并传递新产品 } }

    这个类的一些基本内容和主要方法如下:

    构建方法私有化,避免通过new的方式创建对象,而是通过getInstance方法获得产品列表单例,这里使用的是单例模式。addProductListObserver可以增加一个电商接口(观察者)。核心逻辑在addProduct方法上。在产品列表上增加了一个新的产品,然后调用setChanged方法。这个方法用于告知观察者当前被观察者发生了变化,如果没有,则无法触发其行为。最后通过notifyObservers告知观察者,让它们发生相应的动作,并将新产品作为参数传递给观察者。

    观察者

    观察者需要实现java.util.Observer接口的update方法。 package com.lean.ssm.chapter2.observer; import java.util.Observable; import java.util.Observer; public class JingDongObserver implements Observer { @Override public void update(Observable o, Object product) { String newProduct = (String) product; System.err.println("发送新产品【"+newProduct+"】同步到京东商城"); } } package com.lean.ssm.chapter2.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.err.println("发送新产品【"+newProduct+"】同步到淘宝商城"); } }

    测试这两个观察者 和 产品列表的被观察者:

    package com.lean.ssm.chapter2.observer; public class ObserverTest { public static void main(String[] args) { ProductList observable = ProductList.getInstance(); TaoBaoObserver taoBaoObserver = new TaoBaoObserver(); JingDongObserver jdObserver = new JingDongObserver(); observable.addObserver(jdObserver); observable.addObserver(taoBaoObserver); observable.addProudct("新增产品1"); } }

    执行结果:

    产品列表新增了产品:新增产品1 发送新产品【新增产品1】同步到淘宝商城 发送新产品【新增产品1】同步到京东商城
    最新回复(0)