具体主题类:
package observer2_mode; import java.util.Observable; /** * 具体主题类, 继承自jdk的可被观察类 * 父类JDK已实现, 主要自带了: (1.定义: 观察者集合, 2.添加观察者, 3.移除观察者, 4.通知已注册的观察者, 5.设置变化标记) */ public class ConcreteSubject extends Observable{ /** * 当作气温吧 */ private int state; /** * 获得气温值 */ public int getState() { return state; } /** * 由客户端调用, 改变气温, 并通知已注册的观察者 */ public void set(int state){ this.state = state; setChanged();//设置变化标记, 此处不写不会通知, 底层设置true, 每次通知后, 此标记会被设为false notifyObservers("此处可以传任何类型的对象给观察者!");//通知已注册的观察者 } }
观察者A:
package observer2_mode; import java.util.Observable; import java.util.Observer; /** * 观察者A, 实现了jdk的观察者接口 */ public class ObserverA implements Observer{ /** * 气温 */ private int myState; /** * 当接收到主题通知时, 执行的方法 * 若主题未注册此观察者, 此方法不会被执行 */ @Override public void update(Observable o, Object arg) { this.myState = ((ConcreteSubject)o).getState(); //Object arg, 可以是接收自主题对象发送的任何类型的对象! } /** * 获得气温值 */ public int getMyState() { return myState; } }
测试类:
package observer2_mode; public class Client { public static void main(String[] args) { //具体的主题对象 ConcreteSubject subject = new ConcreteSubject(); //模拟多个观察者 ObserverA obs1 = new ObserverA(); ObserverA obs2 = new ObserverA(); ObserverA obs3 = new ObserverA(); //主题对观察者进行登记注册 subject.addObserver(obs1); subject.addObserver(obs2); subject.addObserver(obs3); //改变主题的状态 subject.set(3000); System.out.println("-------------------------------状态修改了!"); //我们看看,观察者的状态是不是也发生了变化 System.out.println(obs1.getMyState()); System.out.println(obs2.getMyState()); System.out.println(obs3.getMyState()); //改变主题的状态 subject.set(600); System.out.println("-------------------------------状态修改了!"); //我们看看,观察者的状态是不是也发生了变化 System.out.println(obs1.getMyState()); System.out.println(obs2.getMyState()); System.out.println(obs3.getMyState()); } }
执行结果:
-------------------------------状态修改了! 3000 3000 3000 -------------------------------状态修改了! 600 600 600
谢谢声明出处!
转自: http://www.cnblogs.com/gscq073240/articles/7102697.html