观察者模式(一对多的依赖关系):主题对象发生变化时候,通知所有依赖该对象的观察者对象,使得观察者对象更新。
被观察的对象:主题
依赖的对象:观察者
例子:例如一个软件更新版本了,会通知用户版本更新信息
所有观察者都要实现这个观察者接口
package com.ij34.observer; /* * 所有观察者都要实现这个观察者接口 */ public interface Observer { void update(Observable o , Object text); }
主题抽象类,里面含有注册、删除、通知观察者
package com.ij34.observer; import java.util.ArrayList; import java.util.List; import java.util.Iterator; /* * 主题抽象类,里面含有注册、删除、通知观察者 */ public abstract class Observable { List<Observer> list = new ArrayList<Observer>(); public void registObserver(Observer o) { list.add(o); } public void removeObserver(Observer o) { list.remove(o); } public void notifyObservers(Object value) { for (Observer o : list) { o.update(this , value); } } }
产品版本升级了,就通知观察者
package com.ij34.observer; /* * 产品setter更改了,就通知软件所有订阅的人(观察者),继承Observable类,使用notifyObservers方法 */ public class Product extends Observable { private String version; public Product(){} public Product(String version) { this.version=version; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; notifyObservers(version); } }
软件版本观察者
package com.ij34.observer; /* * 当有新的版本时候,通过setter来触发该观察者类VersionObserver */ public class VersionObserver implements Observer{ @Override public void update(Observable o, Object text) { if(text instanceof String){ System.out.println("软件已有新版本:"+text); } } }
测试
package com.ij34.observer; public class Test { public static void main(String[] args) { Product p=new Product(); VersionObserver vo=new VersionObserver(); p.registObserver(vo); p.setVersion("第2018版本"); } }