先俗气的借百科来解释一下概念:
观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
接下来看观察者模式的类结构图:
接下来看一个Java的基本实现:
1.先定义一个被观察者(可以叫做主题)的接口
package com.spook.observer; /** * 主题接口,作为被观察者,被观察者订阅 */ public interface Subject { /** 添加观察者 */ public void addObserver(Observer observer); /** 删除观察者 */ public void removeObserver(Observer observer); /** 通知所有的观察者 */ public void notifyAllObservers(); }2.再定义一个观察者的接口
package com.spook.observer; /** * 观察者接口 */ public interface Observer { /** 观察者收到通知后会响应 */ public void update(); }3.创建一个具体的主题实现类,作为被观察的对象
package com.spook.observer; import java.util.ArrayList; import java.util.List; /** * 具体的某个主题,实现Subject接口 */ public class ConcreteSubject implements Subject { /** 观察者列表 */ private List<Observer> observerList; public ConcreteSubject() { observerList = new ArrayList<Observer>(); } @Override public void addObserver(Observer observer) { observerList.add(observer); } @Override public void removeObserver(Observer observer) { observerList.remove(observer); } @Override public void notifyAllObservers() { for (Observer o : observerList) { o.update(); } } }4.创建一个观察者接口的实现类A
package com.spook.observer; /*** * 观察者A */ public class ObserverA implements Observer { @Override public void update() { // TODO Auto-generated method stub System.out.println("Observer A has received notice!"); } }5.再创建一个观察者接口的实现类B
package com.spook.observer; /*** * 观察者B */ public class ObserverB implements Observer { @Override public void update() { // TODO Auto-generated method stub System.out.println("Observer B has received notice!"); } }6.测试类
package com.spook.observer; /** * 观察者模式测试类 */ public class Test { public static void main(String[] args) { /** 创建一个主题对象 */ ConcreteSubject subject = new ConcreteSubject(); /** 初始化两个订阅者,注意要针对接口编程 */ Observer a = new ObserverA(); Observer b = new ObserverB(); /** 为主题添加观察者 */ subject.addObserver(a); subject.addObserver(b); /** 为主题移除观察者 */ // subject.removeObserver(a); /** 当主题变化时,通知所有观察者 */ subject.notifyAllObservers(); } }运行测试类会输出如下内容:
Observer A has received notice! Observer B has received notice!