java设计模式--观察者(发布订阅)

1、概述:       

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

例如,现实中一个商家有一些产品,和电商合作,当有新产品时,会把这些产品推送到电商。例如京东,伪代码如下:
if(产品库有新产品)

{
  推送到京东;
}
如果公司又和苏宁合作,那么就得改代码
if(产品库有新产品){
推送到京东;
推送到苏宁;
}
这样后面有新合作伙伴,频繁修改if太麻烦了。
        这时,采用观察者模式更易于扩展,责任也清晰。把每一个电商接口看成一个观察者,每个观察者都能观察到产品列表(被监听对象)。当公司发布新产品时,就会发送到这个产品列表上,于是产品列表(被监听对象)就发生了变化,这是就可以触发各个电商接口(观察者)发送新产品到对应的合作电商那里。

二、实例:     

      1、 观察者模式要求同时存在观察者和被观察者双方,观察者可以是多个,在java中,需要去继承java.util.Observable类,先看被观察者-一个产品列表,代码如下:
public class ProductList extends Observable{
    private List productList=null;//产品列表
    private static ProductList instance;//类唯一实例
    private ProductList() {}//构建方法私有化
    
    /*取得唯一实例*/
public static ProductList getInstance() {
    if (instance==null) {
        instance=new ProductList();
        instance.productList=new ArrayList();
    }
    return instance;
}
/*增加观察者*/
public void addProductListObservere(Observer observer) {
    this.addObserver(observer);
}

/*新增产品*/
public void addProduct(String newProduct) {
    productList.add(newProduct);
    System.out.println("新增了产品"+newProduct);
    this.setChanged();//设置被观察者发生了变化
    this.notifyObservers(newProduct);//通知观察者
}

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

2、观察者需要实现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+"】同步到京东商城");
}
}

3、下面测试观察者模式:
public class TestObserver {
public static void main(String[] args) {
    ProductList observable=ProductList.getInstance();
    JingDongObserver jDongObserver=new JingDongObserver();
    observable.addObserver(jDongObserver);
    observable.addProduct("新增产品1");
}
}

结果如下:

 

你可能感兴趣的:(java)