觀察者模式(一對多的依賴關係):主題對象發生變化時候,通知全部依賴該對象的觀察者對象,使得觀察者對象更新。java
被觀察的對象:主題ide
依賴的對象:觀察者測試
例子:例如一個軟件更新版本了,會通知用戶版本更新信息this
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版本"); } }