观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监控某一个主题对象。这个主题对象在状态上发生变化时,会通知其他的观察者对象,让他们能够自动更新自己。
被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。
java
//抽象的观察者
public interface Guancazhe {
public void update();
}
//抽象的被观察者,在其中声明方法(添加、移除观察者,通知观察者):
public interface Guancazhe1 {
public void addGuancazhe(Guancazhe guancazhe);
public void removeGuancazhe(Guancazhe guancazhe);
public void notifyGuancazhe(String str);
}
public class Baobiao implements Guancazhe{
public void update() {
// TODO Auto-generated method stub
System.out.println("运输车有行动,保安贴身保护");
}
}
public class Xiaotou implements Guancazhe{
public void update() {
// TODO Auto-generated method stub
System.out.println("运输车有行动,强盗准备动手");
}
}
public class Police implements Guancazhe{
public void update() {
// TODO Auto-generated method stub
System.out.println("运输车有行动,警察护航");
}
}
//具体的被观察者
public class Beiguancezhe implements Guancazhe1{
//观察者集合
private List<Guancazhe> list = new ArrayList<Guancazhe>();
public void addGuancazhe(Guancazhe guancazhe) {
// TODO Auto-generated method stub
list.add(guancazhe);
}
public void removeGuancazhe(Guancazhe guancazhe) {
// TODO Auto-generated method stub
list.remove(guancazhe);
}
public void notifyGuancazhe(String str) {
// TODO Auto-generated method stub
for (Guancazhe guancazhe : list) {
guancazhe.update();
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Beiguancezhe beiguancezhe = new Beiguancezhe();
Police police = new Police();
Baobiao baobiao= new Baobiao();
Xiaotou xiaotou = new Xiaotou();
beiguancezhe.addGuancazhe(police);
beiguancezhe.addGuancazhe(baobiao);
beiguancezhe.addGuancazhe(xiaotou);
beiguancezhe.notifyGuancazhe(null);
}
使用场合:
(1)当一个抽象模型,其中一个方面依赖于另一方面,把这两者封装在独立的对象中,使其可以独立的改变和复用。
(2)改变一个对象需要改变其他对象,但不知道有多少对象有待于改变。
(3)一个对象必须通知其他对象,但又能假定这些对象(也就是这些对象是紧密耦合的),比如数据采集模块,事先并不知道其他对象是什么。
优点
(1)观察者模式在被观察者和观察者之间建立一个抽象的耦合。
(2)观察者模式支持广播通信,被观察者会向所有登记过的观察者发出通知。
缺点
(1)如果一个被观察者对象有很多观察者的话,将所有的观察者都通知会花费很多时间。
(2)虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。