观察者模式(一对多的依赖关系):主题对象发生变化时候,通知所有依赖该对象的观察者对象,使得观察者对象更新。
被观察的对象:主题
依赖的对象:观察者
例子:例如一个软件更新版本了,会通知用户版本更新信息
所有观察者都要实现这个观察者接口
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{ Listlist = new ArrayList (); 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版本"); }}
测试结果