观察者接口:
package observer_mode; /** * 观察者接口 * 所有观察者类必须是实现了此接口的update方法, 以接收主题的通知 */ public interface Observer { /** * 接收主题的通知时, 执行的方法 */ public void update(Subject subject); }
主题基类:
package observer_mode; import java.util.ArrayList; import java.util.List; /** * 主题基类 */ public class Subject { /** * 定义: 观察者容器 */ protected List<Observer> list = new ArrayList<Observer>(); /** * 添加观察者 */ public void registerObserver(Observer obs){ list.add(obs); } /** * 移除观察者 */ public void removeObserver(Observer obs){ list.remove(obs); } /** * 通知已注册的观察者, 就是在容器中的观察者 */ public void notifyAllObservers(){ for (Observer obs : list) { obs.update(this); } } }
具体主题类:
package observer_mode; /** * 具体主题类 */ public class ConcreteSubject extends Subject{ /** * 当作气温吧 */ private int state; /** * 获得气温值 */ public int getState() { return state; } /** * 由客户端调用, 改变气温, 并通知已注册的观察者 */ public void setState(int state) { this.state = state; //注意此处this, 不能用supper(state字段在父类不存在) this.notifyAllObservers(); } }
观察者A:
package observer_mode; /** * 观察者A */ public class ObserverA implements Observer{ /** * 气温 */ private int myState; /** * 当接收到主题通知时, 执行的方法 * 若主题未注册此观察者, 此方法不会被执行 */ @Override public void update(Subject subject) { this.myState = ((ConcreteSubject)subject).getState(); } /** * 获得气温值 */ public int getMyState() { return myState; } }
测试类:
package observer_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.registerObserver(obs1); subject.registerObserver(obs2); subject.registerObserver(obs3); //改变主题的状态 subject.setState(3000); System.out.println("-----------------------状态修改了!"); //我们看看,观察者的状态是不是也发生了变化 System.out.println(obs1.getMyState()); System.out.println(obs2.getMyState()); System.out.println(obs3.getMyState()); //改变主题的状态 subject.setState(30); System.out.println("-----------------------状态修改了!"); //我们看看,观察者的状态是不是也发生了变化 System.out.println(obs1.getMyState()); System.out.println(obs2.getMyState()); System.out.println(obs3.getMyState()); } }
执行结果:
-----------------------状态修改了! 3000 3000 3000 -----------------------状态修改了! 30 30 30
谢谢声明出处!
转自: http://www.cnblogs.com/gscq073240/articles/7102633.html

浙公网安备 33010602011771号