观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听同一个主题对象,当主题对象内部状态发生变化时,通知所有观察者
观察着模式在java中又很重要的应用和地位,在awt,Swing的监听器中应用广泛,java甚至对他提供了内置的支持。
观察者模式有以下组成:
-两个抽象角色:
---抽象主题角色:将所有观察者对象的引用放到一个集合里,提供接口用于增删,一般用抽象类或者接口实现,使用java提供的Observable接口
---抽象观察者:使用java提供的Observer接口
-两个具体角色:
---具体主题角色:当具体主题内部状态改变时,给所有登记过的观察者,发通知,实现Observable接口。
---具体观察者角色:实现Observer接口,重写update方法
测试:
一、具体主题角色,实现java内置的抽象主题接口 Observable
/** * Created by charleszhu on 14-2-3. * 具体主题角色 */ public class MyObserverable extends Observable { public void notifyTwoOb(int i){ // 自定义通知方法 for(;i>0;i--){ this.setChanged();//状态改变的时候,一定改变changed的值 this.notifyObservers(i);// 通知所有观察者状态已经发生的变化 } } }
二、定义两个观察者角色,方法,实现java内置的Observer接口
/** * Created by charleszhu on 14-2-3. */ public class MyObserve implements Observer { // 监听对象,当对象的参数减少时候,输出 @Override public void update(Observable o, Object arg) { // Integer i = (Integer)arg; System.out.println(arg); } }
/** * Created by charleszhu on 14-2-3. */ public class MyObserve1 implements Observer { // 监听对象,当对象的参数减少到5的时候,输出 @Override public void update(Observable o, Object arg) { Integer i = (Integer)arg; if (i<=5) System.out.println(i); } }
三 写测试类
/** * Created by charleszhu on 14-2-3. */ public class Test { public static void main(String[] args) { // 生成主题对象实例 MyObserverable mb = new MyObserverable(); // 生成两个观察者 Observer o1 = new MyObserve(); Observer o2 = new MyObserve1(); // 将观察者放入主题中 mb.addObserver(o1); mb.addObserver(o2); // 调用通知观察者方法 mb.notifyTwoOb(10); } }