观察者模式的英文原文是:Define a one-to-many dependency between objects so that when one object changes state, all its depedents are notified and updated automaticlly.意思是:定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,所有依赖于它的对象都会得到通知并且自动更新。
观察者模式的4个角色:
抽象主题角色(Subject):该角色被称为“被观察者”,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色(Observer):该角色为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。
具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
观察者模式的类图:
观察者模式对应的各个类:
抽象主题:
package com.zz.observer;
/**
* 抽象主题角色
* Copyright 2015年5月30日
* created by txxs
* all right reserved
*/
public interface Subject {
//登记一个新的观察者
public void attach(Observer obs);
//删除一个登记过的观察者观色
public void detach(Observer obs);
//通知所有登记过的观察者的对象
public void notifyObserver();
}
抽象观察者:
package com.zz.observer;
/**
* 抽象观察者角色
* Copyright 2015年5月30日
* created by txxs
* all right reserved
*/
public interface Observer {
public void update();
}
具体主题:
package com.zz.observer;
import java.util.Enumeration;
import java.util.Vector;
/**
* 具体主题
* Copyright 2015年5月30日
* created by txxs
* all right reserved
*/
public class ConcreteSubject implements Subject {
private Vector<Observer> obsVector = new Vector<Observer>();
//登记一个新的观察者
@Override
public void attach(Observer obs) {
obsVector.add(obs);
}
//删除一个登记过的观察者
@Override
public void detach(Observer obs) {
obsVector.remove(obs);
}
//通知所有等级过的观察者
@Override
public void notifyObserver() {
for(Observer ob : obsVector){
ob.update();
}
}
//返回观察者的Enumeration对象
public Enumeration<Observer> observers(){
return obsVector.elements();
}
//改变状态
public void change(){
this.notifyObserver();
}
}
具体观察者:
package com.zz.observer;
/**
* 具体观察者
* Copyright 2015年5月30日
* created by txxs
* all right reserved
*/
public class ConcreteObserver implements Observer {
@Override
public void update() {
//相关业务处理
}
}
客户端:
package com.zz.observer;
/**
* 客户端
* Copyright 2015年5月30日
* created by txxs
* all right reserved
*/
public class Client {
public static void main(String args[]){
ConcreteSubject subject = new ConcreteSubject();
Observer obs = new ConcreteObserver();
subject.attach(obs);
subject.change();
}
}
观察者模式的优点:
1、观察者和被观察者之间是抽象耦合
2、支持广播通信
观察者模式的应用场景:
1、关联行为的场景
2、事件多级触发的场景
3、跨系统消息交换的场景