Observable观察者模式个人理解
目录
观察者模式:
又称发布订阅模式(似乎两者之间有一些差别),对象的行为模式,它定义了一种一对多的依赖关系,即多个【观察者】监视一个【被观察者】,当【被观察者】发生状态改变的时候,通知所有【观察者】并使其做出相应的反应。
比如函数 y=2x,y在观察到x值的变化的同时自身也发生改变。
下面模拟电商发布新产品的流程
被观察者:产品列表
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(){} //私有化构造方法,禁止new生成实例对象
//单例对象实例化方法
public static ProductList getInstance(){
if(instance == null){
instance = new ProductList();
instance.productList = new ArrayList<String>();
}
return instance;
}
//增加观察者方法(间接调用)
public void addProductListObserver(Observer observer){
this.addObserver(observer);
}
//变更状态方法(即改变被观察者的状态)
public void addProduct(String newProduct){
productList.add(newProduct);
System.out.println("Add new product :"+newProduct);
this.setChanged();
this.notifyObservers(newProduct);
}
}
Observable类内部有个changed属性(boolean类型),默认为false,setChanged()方法将changed设置为ture,告诉被观察者你发生了改变。
this.notifyObservers(newProduct) 通知所有的观察者,这里以一个字符串的数据类型(newProduct)作为通知传递给观察者们
notifyObservers()方法的内部调用了Observer接口(观察者们类继承的接口)的update()方法,那么观察者们需要通过重写update()方法来达成自身所需要的一些业务逻辑(比如打印一些信息在屏幕上)
观察者:TBObserver
import java.util.Observable;
import java.util.Observer;
public class TBObserver implements Observer {
@Override
public void update(Observable o, Object product) {
//因为被观察者传递了一个字符串数据通知,所以此处接受到的product是String类型的,只是需要把共同父类Object转换成String
String newProduct = (String)product;
//【观察者(this)】 在 观察 到 【被观察者(ProductList)】 发生 改变 的时候,做出动作
System.err.println("Send new product ["+newProduct+" ] to TB's Online ShoppingMall");
}
}
观察者:JDObserver
import java.util.Observable;
import java.util.Observer;
public class JDObserver implements Observer {
@Override
public void update(Observable o, Object product) {
// TODO Auto-generated method stub
String newProduct = (String)product;
System.err.println("Send new product ["+newProduct+" ] to JD's Online ShoppingMall");
}
}
测试类
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//被观察者单例对象实例化
ProductList observable = ProductList.getInstance();
//实例化观察者对象
TBObserver tbo = new TBObserver();
JDObserver jdo = new JDObserver();
//添加观察者
observable.addObserver(jdo);
observable.addObserver(tbo);
//新增产品,使被观察者对象状态发生改变,从而通知到观察者对象使其做出相应的反应
observable.addProduct("XXX洗面奶");
}
}
结果输出
Add new product :XXX洗面奶
Send new product [XXX洗面奶 ] to TB’s Online ShoppingMall
Send new product [XXX洗面奶 ] to JD’s Online ShoppingMall
总结
首先就是多个观察者(TBObserver 和 JDObserver)需要实现观察者接口Observer,重写方法update(Observable o, Object args),第一个参数不需要改变,即Observable类,它建立了【被观察者】和【观察者】间的依赖关系,通过将通知塞给它并告诉它发生了改变,交由它去调用update方法,造成观察者们的改变。第二个参数args即从被观察者那获取到的通知(Object)。被观察者要保证单例,继承Observable类,编写自己需要的改变并调用 notifyObservers()方法。