观察者(Observer)模式又称发布订阅模式,是对象的行为模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监视着被观察者的状态,当被观察者的状态发生变化时,会通知所有观察者,并让其自动更新自己。
多个对象(电商接口)监听一个对象(产品列表),当被监听者(产品列表)发生变化时,监听者(电商接口)就会触发一定当行为以适合变化的逻辑模式,我们称为观察者模式。这样的好处在于,程序中不在出现if语句,观察者会根据观察对象的变化而做出对应的行为。
被观察者:
package com.wlz;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
* @author zhiqiang zhang
* @create 2019-02-14-11:18
**/
public class ProductList extends Observable {
private List<String> productList=null;//产品列表
private static ProductList instance;//类唯一实例
/**
* 构造方法私有化,避免通过new新建对象,而是通过getInstance方法获得产品列表单例
*/
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 addProduct(String newProduct){
productList.add(newProduct);
System.out.println("产品列表新增产品:"+newProduct);
//调用setChanged方法,告知观察者当前被观察者发生了变化
this.setChanged();//设置被观察对象发生变化
//通过notifyObservers告知观察者,并让它们发生相应的动作,并将新产品作为参数传递给观察者
this.notifyObservers(newProduct);//通知观察者,并传递新产品
}
}
观察者一:
package com.wlz;
import java.util.Observable;
import java.util.Observer;
/**
* @author zhiqiang zhang
* @create 2019-02-14-14:39
**/
public class JdServer implements Observer {
@Override
public void update(Observable o, Object product) {
String newProduct=(String)product;
System.out.println("发送新产品"+newProduct+"同步到京东商城。");
}
}
观察者二:
package com.wlz;
import java.util.Observable;
import java.util.Observer;
/**
* @author zhiqiang zhang
* @create 2019-02-14-14:44
**/
public class TbServer implements Observer {
@Override
public void update(Observable o, Object product) {
String newProduct=(String)product;
System.out.println("发送新产品"+newProduct+"同步到淘宝商城。");
}
}
测试:
package com.wlz;
/**
* @author zhiqiang zhang
* @create 2019-02-14-14:48
**/
public class TestObserver {
public static void main(String[] args) {
TestObserver.Test();
}
public static void Test(){
ProductList productList=ProductList.getInstance();
TbServer tbServer=new TbServer();
JdServer jdServer=new JdServer();
productList.addObserver(tbServer);
productList.addProduct("商品1");
productList.addObserver(jdServer);
productList.addProduct("商品2");
}
}
运行结果:
产品列表新增产品:商品1
发送新产品商品1同步到淘宝商城。
产品列表新增产品:商品2
发送新产品商品2同步到京东商城。
发送新产品商品2同步到淘宝商城。