1、模式定义
定义对象间的一种一对一多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被更新。
2,模式四个角色
- 目标(Subject):又称主题,他是被观察的对象。在目标中定义了一个观察者集合,他可以存储任意数量的观察者对象,他提供一个接口来增加和删除观察者对象,同时也定义了通知方法
notify()
。 - 具体目标(ConcreteSubject):是目标类的子类,通常它包含经常发生改变的数据,当状态发生改变时向各个观察者发出通知。
- 观察者(Observer): 观察者对被观察对象的状态改变做出反应,观察者一般被定义为接口,该接口声明了更新数据的方法
update()
- 具体观察者(ConcreteObserver):在具体观察者中维护一个指向具体目标对象的引用,他存储了具体观察者的有关状态这个状态需要和具体目标保持一致,他实现了在抽象观察者中定义的
update()
方法。通常在实现时,可以调用具体的目标类的attach()
方法将自己添加到目标类的观察者集合中或者通过detach()
方法将自己从观察者集合中删除。
3,java中的实现
在java中使用观察者模式需要实现java.util.Observable
类。
被观察者类:
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;
public ProductList() {
}
/**
*
* @return 唯一实例
*/
public static ProductList getInstance(){
if(instance==null){
instance = new ProductList();
instance.productList = new ArrayList<String>();
}
return instance;
}
/**
* 添加观察者
* @param observer
*/
public void addProductListOberver(Observer observer){
this.addObserver(observer);
}
/**
* 移除观察者
* @param observer
*/
public void delectProductOberver(Observer observer){
this.deleteObserver(observer);
}
/**
* 增加观察者
* @param newProduct
*/
public void addProduct(String newProduct){
//增加新产品
System.out.println("增加了新产品"+newProduct);
productList.add(newProduct);
this.setChanged();//设置被观察者对象发生了改变
this.notifyObservers(newProduct);//通知观察者发生了改变
}
}
三个观察者类:
import java.util.Observable;
import java.util.Observer;
public class Oberver1 implements Observer {
@Override
public void update(Observable o, Object arg) {
String newProduct = (String)arg;
System.out.println("观察者 1 观察到了添加了"+newProduct);
}
}
import java.util.Observable;
import java.util.Observer;
public class Oberver2 implements Observer {
@Override
public void update(Observable o, Object arg) {
String newProduct = (String)arg;
System.out.println("观察者 2 观察到了添加了"+newProduct);
}
}
import java.util.Observable;
import java.util.Observer;
public class Observer3 implements Observer {
@Override
public void update(Observable o, Object arg) {
String newProduct = (String)arg;
System.out.println("观察者 3 观察到了添加了"+newProduct);
}
}
测试主函数类:
public class TestMain {
public static void main(String[] args) {
ProductList observable = ProductList.getInstance();
Oberver1 oberver1 = new Oberver1();
Oberver2 oberver2 = new Oberver2();
Observer3 observer3 = new Observer3();
//给被观察者添加观察者
observable.addObserver(oberver1);
observable.addObserver(oberver2);
observable.addObserver(observer3);
//添加一个被观察者,使得状态改变
observable.addProduct("被观察者1");
//移除观察者2
observable.deleteObserver(oberver2);
//添加被观察者2
observable.addProduct("被观察者2");
}
}
观察者模式的作用,优点与缺点
- 观察者模式可以实现表示层和数据逻辑层的分离
- 观察者模式在观察目标和观察者之间建立一个抽象的耦合
- 观察者模式支持广播通信
- 观察者模式符合“开闭原则”
- 观察者很多的话,每个观察者被通知会花很多时间。
- 如果观察者和被观察者之间有循环依赖的话,有可能导致系统崩溃。
- 观察者模式没有相应的机制使得观察者知道所观察的目标是怎样发生变化的。