观察者模式:
又称“发布订阅模式”,一对多的依赖关系,让多个观察者对象同时监管一个被观察者的状态,当被观察者的状态发生改变的时候,会通知所有观察者,并让其自动更新自己的状态。
案例对比
一个商家有一些产品,它和一些电商合作,每当有新产品时,就会把这些产品推送给电商,假如现在只和淘宝、京东合作,那么代码如下:
if(产品库有新产品){
推送产品到淘宝;
推送产品到京东;
}
如果,公司和当当网、苏宁有合作关系,那么更新代码如下:
if(产品库有新产品){
推送产品到淘宝;
推送产品到京东;
推送产品到当当;
推送产品到苏宁;
}
像这种方式,如果,我新增电商合作,就需要在if中新增电商信息,如果说,我合作的电商有100家,那么我的if中就有100条逻辑,如果,有一个电商发生了异常,那么程序就不会继续执行,为了避免这种情况,就需要为每个电商都设置捕捉异常,这样的话,性能会大大折扣,且风险大。
观察者模式
这样电商接口去监听产品列表,当被监听对象发生状态改变时,监听者就会发生一定的变化,做出相应的逻辑变化,这样的好处就是低耦合,产品只负责产品部分,电商只负责自己的电商接口部分,责任明确。
代码示例
观察者模式要同时存在观察者和被观察者双方,观察者可以是多个,在java需要继承java.util.Observable类。
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 addProduct(String newProduct) {
productList.add(newProdct);
System.out.println("产品列表新增了产品:"+newProduct);
this.setChanged();//设置被观察对象发生变化
this.notifyObservers(newProduct);//通知观察者,并传递新产品
}
}
1、通过getInstance方法获得产品列表
2、通过addProductListObserver可以增加一个电商接口
3、核心逻辑addProduct上,在产品列表上增加一个新的产品,然后调用setChanged方法。这个方法告知电商接口,产品列表发生的变化,如果没有,则无法触发其行为。最后通过notifyObservers告知电商接口,让它们发生相应的动作,并将新产品作为参数传递给电商接口。
4、已经有了产品列表对象,还要去编写电商接口。作为观察者需要实现java.util.Observer接口的update方法
/*************京东接口******************/
public class JingDongObserver implements Observer{
@Override
public void update(Observable o,Object product) {
String newProduct = (String) product;
System.out.println("发送新产品【"+newProduct+"】同步到京东商场");
}
}
/*************淘宝接口******************/
public class TaoBaoObserver implements Observer{
@Override
public void update(Observable o,Object product) {
String newProduct = (String) product;
System.out.println("发送新产品【"+newProduct+"】同步到淘宝商场");
}
}
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】同步到淘宝商城
发送新产品【新增产品2】同步到京东商城