使用场景:
当一个对象的行为依赖于另一个对象的状态。
一般用于事件监听、通知发布等场合
应用场景:
swing框架中的JButton实现 [按钮点击,通知监听器]
源码实践
观察者
package xin.rtime.design.observer;// 抽象的观察者public interface IObserver {public void update(String msg);}
被观察者
package xin.rtime.design.observer;// 抽象的被观察者 [主题接口] --- 可以查看 java.util.Observable实现public interface ISubject {// 注册观察者public void registerObserver(IObserver o);// 删除观察者public void removeObserver(IObserver o);// 通知观察者public void notifyObserver();// 带参数的通知观察者void notifyObserver(String args);}
具体的观察者
package xin.rtime.design.observer;import java.util.Vector;// 具体的被观察者对象public class ConcreteSubject implements ISubject{Vector<IObserver> observers = new Vector<IObserver>();@Overridepublic void registerObserver(IObserver o) {observers.add(o);}@Overridepublic void removeObserver(IObserver o) {observers.remove(o);}@Overridepublic void notifyObserver() {notifyObserver(null);}@Overridepublic void notifyObserver(String args) {for(IObserver iObserver : observers) {iObserver.update(args);}}}
具体的观察者
package xin.rtime.design.observer;// 具体的观察者public class ConcreteObserver implements IObserver {@Overridepublic void update(String msg) {System.out.println("update " + msg);}}
验证
package xin.rtime.design;import java.util.Observable;fimport xin.rtime.design.observer.ConcreteObserver;import xin.rtime.design.observer.ConcreteSubject;public class ObServerTest {public static void main(String[] args) {// 简易实现ConcreteSubject subject = new ConcreteSubject(); // 定义主题subject.registerObserver(new ConcreteObserver()); // 注册观察者ConcreteObserver observer2 = new ConcreteObserver();subject.registerObserver(observer2); // 注册观察者subject.notifyObserver(); // 发送通知subject.removeObserver(observer2); // 删除观察者subject.notifyObserver("test"); // 继续通知}}

JDK原生实践
定义一个观察者:
package xin.rtime.observable;public class MyObservable extends Observable {private int num;public int getNum() {return num;}public void setNum(int num) {this.num = num;setChanged(); // 变更状态notifyObservers(num); // 通知}}
验证:
package xin.rtime.design;import java.util.Observable;import java.util.Observer;import xin.rtime.design.observable.MyObservable;public class ObServerTest {public static void main(String[] args) {// jdk 内置观察者apiMyObservable observable = new MyObservable();Observer observer = new Observer() {@Overridepublic void update(Observable o, Object arg) {System.out.println("udpate " + arg); // 接收通知}};observable.addObserver(observer);observable.setNum(123);}}

