今天再看《重構》這本書,8.6這一篇:Duplicate Observed Data ,講述能夠使用相似觀察者模式的方法,將處理用戶界面的處理業務邏輯的代碼分開,形如MVC模式; java
觀察者模式就至關於使用觀察者一直注意着view層的數據變化,若是變化,就須要使用Controller層進行業務處理,隔離了view--Controller; spring
在spring中,相似 Spring事件處理 的方法,也能夠理解爲 觀察者模式: app
◆定義Event類,繼承org.springframework.context.ApplicationEvent。
◆編寫發佈事件類Publisher,實現org.springframework.context.ApplicationContextAware接口。
◆覆蓋方法setApplicationContext(ApplicationContext applicationContext)和發佈方法publish(Object obj)。
◆定義時間監聽類EventListener,實現ApplicationListener接口,實現方法onApplicationEvent(ApplicationEvent event)。 測試
關於 Spring事件處理的方法並不在此文章中過多描述。 this
下面寫一個在電商系統中很常常遇到的例子,若是商品價格發生了變化,那麼將此商品價格變化的事件通知給對應的會員, 形如 降價通知 的簡單實現: spa
代碼分爲三個部分,商品類;顧客類;測試類; code
package observer; import java.util.Observable; public class Good extends Observable { private String name; private float price; public Good(String name, float price) { this.name = name; this.price = price; } public String getName() { return name; } public float getPrice() { this.notifyObservers(price); return price; } public void setPrice(float price) { this.price = price; /* * 注意 :在通知 全部觀察者以前 必定要調用 setChanged()方法來設置被觀察者的狀態已經被改變, */ this.setChanged(); /* * notifyObservers 方法在通知完全部嗎 觀察者 後, 會自動調用 clearChanged 方法來清除 被觀察者 的狀態改變。 */ this.notifyObservers(price); } }
package observer; import java.util.Observable; import java.util.Observer; public class Customer implements Observer { private String name; public Customer(String name) { this.name = name; } public String getName() { return name; } public void update(Observable observable, Object arg) { if (observable instanceof Good && arg instanceof Float) { System.out.println("VIP客戶<" + this.name + ">您好 : " + ((Good) observable).getName() + "的價格變了," + arg + "元了 !"); } } }
package observer; public class Test { public static void main(String[] args) { Good good = new Good("商品A", 1.0f); Customer alexgaoyh_1 = new Customer("alexgaoyh_1"); Customer alexgaoyh_2 = new Customer("alexgaoyh_2"); good.addObserver(alexgaoyh_1); good.addObserver(alexgaoyh_2); good.setPrice(10.0f); good.setPrice(30.0f); } }以上三處代碼的簡單實現,實現了當商品價格發生變化的話,會及時通知給對應的顧客。
被觀察者類: server
extends java.util.Observable
調用 對象
void addObserver(Observer o)當被觀察事件發生時,執行:
setChanged(); notifyObservers();
觀察者類: 繼承
implements java.util.Observer實現 Observer 接口的惟一方法 update
void update(Observable o, Object arg)