1. 观察者模式:
观察者模式,也叫发布/订阅模式,定义如下:
定义对象之间的一种一对多的依赖关系,使得每当一个对象的状态改变时,多有依赖于它的对象都能及时得到通知并被自动更新
2. 观察者模式的相关角色介绍:
a、 抽象被观察者角色
定义被观察者必须实现的职责,它必须能够动态地添加和取消观察者,一般由抽象类构成。仅完成被观察者的职责:管理观察者并通知观察者
b、 具体被观察者角色
定义被观察者自己的业务逻辑,同时定义对那些事件发出通知
c、 抽象的观察者角色
观察者接收到消息之后进行update操作,即对收到的信息进行处理
d、 具体的观察者角色
每个观察者接收到消息之后处理的反应不同,每个观察者都有自己的处理逻辑
3. 观察者模式通用示例代码:
抽象被观察者类:
/**
* 抽象主题角色类,也称为抽象主题被观察者
* @author zqkj001
*
*/
public abstract class Subject {
/**
* 用来保存注册的注册的观察者对象
*/
private List<Observer> list=new ArrayList<Observer>();
/**
* 注册观察者对象到list
* @param ob
*/
public void attach(Observer ob){
list.add(ob);
System.out.println("attach an observer..");
}
/**
* 删除观察者对象
* @param ob
*/
public void detach(Observer ob){
list.remove(ob);
}
/**
* 通知所有注册的观察者对象
* @param newState
*/
public void notifyObservers(String newState){
for (Observer ob : list) {
ob.update(newState);
}
}
}
具体被观察者类:
/**
* 具体主题角色类/具体主题被观察者类
* @author zqkj001
*
*/
public class ConcreteSubject extends Subject {
private String state;
public String getState() {
return state;
}
public void change(String newState){
this.state=newState;
System.out.println("主题状态更改为:"+this.state);
//状态发生改变,通知各个观察者
super.notifyObservers(this.state);
}
}
抽象观察者类
/**
* 抽象观察者角色类
* @author zqkj001
*
*/
public interface Observer {
/**
* 更新接口
* @param newState
*/
public void update(String newState);
}
具体观察者类
/**
* 具体观察者角色类
* @author zqkj001
*
*/
public class ConcreteObserver implements Observer {
private String observerState;
@Override
public void update(String newState) {
//更新观察者状态,使其与目标状态一致
this.observerState=newState;
System.out.println("状态为:"+this.observerState);
}
}
测试类:
public class Client {
public static void main(String[] args) {
//创建主题对象(被观察者)
ConcreteSubject subject=new ConcreteSubject();
//创建观察者对象
Observer observer=new ConcreteObserver();
//将观察者绑定到主题对象(被观察者)上
subject.attach(observer);
//改变主题对象(被观察者)的状态
subject.change("a new State");
}
}
4. 示例代码对应的类图:
JDK中提供了:java.util.Observable实现类和java.util.Observer接口,上面的代码中的一个抽象被观察者类和观察者接口可以分别用这2个替换。
JDK调用示例:
public class ConcreteSubject1 extends Observable {
public void operator(){
super.setChanged();
super.notifyObservers("改变了");
}
}
public class ConcreteObserver1 implements Observer {
@Override
public void update(Observable ob, Object str) {
System.out.println("观察者接收到状态:"+str);
}
}
public class Test {
public static void main(String[] args) {
ConcreteSubject1 ob=new ConcreteSubject1();
Observer observer=new ConcreteObserver1();
ob.addObserver(observer);
ob.operator();
}
}