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(); } }