字面理解:一个对象或者多个对象同时去观察一个对象,当查看到被观察的对象发生变化的时候,观察者会发生相应的变化;或者说是 一个被观察的对象本身的数值发生变化的时候回去主动的通知监视他的对象;
例如:计算机的时间是通过网络获取,当获取的网络发生变化的时候,本地的时间显示器或者是第三方显示器会发生相应得变化,网络变化一秒,本地就变化一秒,如果不及时更新,显示器就会发生变化;
观察者之间可能会有相同的接口也可能没有,反正就是对被观察者感兴趣;
时间变化的接口:需要去监视网络时间的第三方程序需要继承这个接口:
public interface ObserveInterface { void update(Object time); }
观察者:时间软件A B C:
public class TimerA implements ObserveInterface{ @Override public void update(Object obj) { System.out.println("A 收到时间更新"); } }
public class TimerB implements ObserveInterface { @Override public void update(Object obj) { System.out.println("B 收到时间更新"); } }
public class TimerC implements ObserveInterface { @Override public void update(Object obj) { System.out.println("C 收到时间更新"); } }
被观察者是网络中的时间:ObserveredTime,观察着要监听他之前需要将他注册到被观察者里面,这样ObserveredTime变化的时候才知道要去通知谁;
/** * 被观察着对象 */ public class ObserveredTime { //记录注册的对象,方便时间变化的时候去通知改变 List <ObserveInterface> listens= new ArrayList<>(); private long currentTime; public void addObserver(ObserveInterface observeInterface) { listens.add(observeInterface); } public void changeTime(long changeTime) { setCurrentTime(changeTime); } public void setCurrentTime(long currentTime) { this.currentTime = currentTime; observerListener(currentTime); } public void observerListener(long changeTime) { for (ObserveInterface observeInterface : listens) { observeInterface.update(changeTime); } } }
测试一下:
public class ObserverTest { public static void main(String[] args) { ObserveredTime observeredTime = new ObserveredTime(); //观察者 A B C TimerA a = new TimerA(); TimerB b = new TimerB(); TimerC c = new TimerC(); //注册到被观察者里面 observeredTime.addObserver(a); observeredTime.addObserver(b); observeredTime.addObserver(c); observeredTime.changeTime(System.currentTimeMillis()); } }
测试结果:
zhou.ObserverDesign.ObserverTest
A 收到时间更新
B 收到时间更新
C 收到时间更新
Process finished with exit code 0;
以上就是我所理解的观察者模式,其实在目前项目中也使用过这种模式,后台上传数据,继承了更改的数据接口的类会都去监听数据,有变化就会通知;只是可能还不了解那就是“观察者模式”这样命名^.^