java Observer模式 重構 Duplicate Observed Data

    今天再看《重構》這本書,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();



setChange() 方法用來設置一個內部標誌位註明數據發生了變化; notifyObservers() 方法會去調用觀察者對象列表中全部的 Observer update() 方法,通知它們數據發生了變化。
只有在 setChange() 被調用後, notifyObservers() 纔會去調用 update()


觀察者類: 繼承

implements java.util.Observer
實現 Observer 接口的惟一方法 update

void update(Observable o, Object arg)
形參 Object arg ,對應一個由 notifyObservers(Object arg); 傳遞來的參數,當執行的是 notifyObservers(); 時, arg null
相關文章
相關標籤/搜索