3 观察者模式
观察者模式又称发布订阅模式,是对象的行为模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听着被观察者的状态,当被观察者的状态发送变化时,会通知所有观察者,并让其自动更新自己。
观察者模式要同时存在观察者和被观察者双方,观察者可以是多个。在Java中,需要继承java.util.Observable类。
被观察者的产品列表:
package com.feike.observer;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
* @ProjectName: chapter2
* @Package: com.feike.observer
* @ClassName: ProductList
* @author: Feike
* @description:
* @date: 2020/6/28 21:33
* @version: 1.0
*/
public class ProductList extends Observable {
/**
* 产品列表
*/
private List<String> productList = null;
/**
* 类唯一实例
*/
private static ProductList instance;
/**
* 获取唯一实例
* @return 产品列表唯一实例
*/
public static ProductList getInstance(){
if (instance == null){
instance = new ProductList();
instance.productList = new ArrayList<>();
}
return instance;
}
/**
* 增加观察者(电商接口)
* @param observer 观察者
*/
public void addProductListObserver(Observer observer){
this.addObserver(observer);
}
public void addProduct(String newProduct){
productList.add(newProduct);
System.out.println("产品列表新增了产品:" + newProduct);
//设置被观察者发生了变化
this.setChanged();
//通知观察者,并传递新产品
this.notifyObservers(newProduct);
}
}
- 构建方法私有化,避免通过new的方式创建对象,而是通过getInstance方法获得产品列表单例,这里使用的是单例模式。
- addProductListObserver 可以增加一个电商接口(观察者)
- 核心逻辑在addProduct方法上。在产品列表上增加了一个新的产品,然后调用setChanged方法。这个方法用于告知观察者放生了变化,如果没有,则无法触发其行为。最后通过notifyObserve告知观察者,让它们发生相应的动作,并将新产品作为参数传递给观察者。
京东电商接口:
public class JingDongObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
String newProduct = (String) arg;
System.out.println("发送新产品【" + newProduct+ "】同步到京东商城!");
}
}
淘宝电商接口:
public class TaobaoObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
String newProduct = (String) arg;
System.out.println("发送新产品【"+newProduct+"】同步到淘宝商城");
}
}
测试观察者模式:
@Test
public void test(){
ProductList observable = ProductList.getInstance();
TaobaoObserver taobaoObserver = new TaobaoObserver();
JingDongObserver jingDongObserver = new JingDongObserver();
observable.addObserver(jingDongObserver);
observable.addObserver(taobaoObserver);
observable.addProduct("鼠标");
}
测试结果:
产品列表新增了产品:鼠标
发送新产品【鼠标】同步到淘宝商城
发送新产品【鼠标】同步到京东商城!