观察者模式又被称为发布订阅模式,是对象的一种行为模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监视着被观察者的状态,当被观察者的状态发生变化的时候,会通知所有的观察者,并且让他们自己去更新自己。
这么说可能不是很明白 ,用个最简单的例子来说吧,目前比较操蛋的电商,
if(产品库有新的产品){
推送产品到淘宝
推送产品到京东
}
这样的也就是说,如果公司和国美,苏宁,当当这些个签订了协议,那么就需要改动这段伪代码
if(产品库有新的产品){
推送产品到淘宝
推送产品到京东
推送产品到国美
推送产品到苏宁
推送产品到当当
。。。。。。
}
如果说按着这说法,那特么凉了,如果和其他电商合作,那继续在if里面加逻辑,这样代码维护起来复杂的很,
而且也会出现责任不清楚的状态。
而观察者模式更加的易于扩展,首先把每个电商的接口看成观察者,那么相应的产品库就是被观察者,没一个观察者都能看到产品的列表(被监听的对象),每次发布新产品,就到这个列表里面去,这时候出发各个电商接口发送新的产品到对应的合作电商里面
来个图
类似这个,电商接口就被称之为观察者或者说是监听者,二产品对象就被称为被观察者或者是被监听者
下面来一段代码实例解释、
首先是被观察的产品列表
package com.yldyyn.test;
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(){}//构建私有方法
/**
* 取得唯一的实例
*/
public static ProductList getInstance(){
if (instance == null){
instance =new ProductList();
instance.productList = new ArrayList<String>();
}
return instance;
}
/**
* 增加观察者 (电商接口)
* @param observable 观察者
*/
public void addProdcutListObserver(Observer observable){
this.addObserver(observable);
}
/**
* 新增产品
* @param newProduct 新产品
*/
public void addProduct(String newProduct){
productList.add(newProduct);
System.out.println("产品列表新增了产品:"+newProduct);
this.setChanged();//设置被观察对象发生变化
this.notifyObservers(newProduct);//通知观察者并且传递新的产品
}
}
这个类里面的基本方法解释一下
构建方法私有化,避免了通过new的方式创建对象,而是通过getInstance方法获得产品列表的单利,使用的是单例模式!
addProdcutListObserver这个方法是用来增加电商接口的(也就是说他是一个观察者)
核心的逻辑都在后边的addProdcut上面,而后边的notifyObservers就是通知观察者他们发生了相应的动作了,
这个时候已经是有了被观察者对象,我们还需要编写观察者,仍然使用淘宝京东这为例子,去实现他们的电商接口,作为观察和需要实现java.util.Observer接口的Update方法,
代码如下所示
import java.util.Observable;
import java.util.Observer;
public class JingDongObserver implements Observer {
/**
* 这是京东的电商接口
* @param o
* @param product
*/
@Override
public void update(Observable o, Object product) {
String newProduct = (String)product;
System.err.println("发送心产品【"+newProduct+"】同步到京东商城");
}
}
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+\"】同步到淘宝商城");
}
}
用下面的代码来测试两个观察者和产品列表的被观察者
public class TaoBaoOrJingDongTest {
public static void main(String[] args) {
ProductList observable = ProductList.getInstance();
TaoBaoObserver taoBaoObserver = new TaoBaoObserver();
JingDongObserver jingDongObserver = new JingDongObserver();
observable.addObserver(taoBaoObserver);
observable.addObserver(jingDongObserver);
observable.addProduct("新增产品1");
}
}
中间我隔离出来的代码也就是这一段
observable.addObserver(taoBaoObserver);
observable.addObserver(jingDongObserver);
这是对被观察者注册观察者,这样才能让观察者监控到被观察者的变化情况,而他的运行结果则是
产品列表新增了产品:新增产品1
发送心产品【新增产品1】同步到京东商城
发送心产品【"+newProduct+"】同步到淘宝商城
也就是说以后在产品列表中发布新的商品,观察者们都可以出发对应的行为了,就不会出现if语句的各类的问题了,也更加的易于维护了。