Java 深入到一定程度 , 就不可避免的碰到設計模式 (design pattern) 這一概念 , 瞭解設計模式 , 將使自己對 java 中的介面或抽象類別應用有更深的理解。設計模式在 java 的中型系統中應用廣泛 , 遵循一定的編程模式 , 才能使自己的代碼便於理解 , 易於交流 ,Observer( 觀察者 ) 模式是比較常用的一個模式 , 尤其在介面設計中應用廣泛 , 而本站所關注的是 Java 在電子商務系統中應用 , 因此想從電子商務實例中分析 Observer 的應用。
雖然網上商店形式多樣 , 每個站點有自己的特色 , 但也有其一般的共性 , 單就 " 商品的變化 , 以便及時通知訂戶 " 這一點 , 是很多網上商店共有的模式 , 這一模式類似 Observer patern 。
具體的說 , 如果網上商店中商品在名稱 價格等方面有變化 , 如果系統能自動通知會員 , 將是網上商店區別傳統商店的一大特色。這就需要在商品 product 中加入 Observer 這樣角色 , 以便 product 細節發生變化時 ,Observer 能自動觀察到這種變化 , 並能進行及時的 update 或 notify 動作。
Java 的 API 還爲爲我們提供現成的 Observer 介面 Java.util.Observer 。我們只要直接使用它就可以。
我們必須 extends Java.util.Observer 才能真正使用它 :
1. 提供 Add/Delete observer 的方法 ;
2. 提供通知 (notisfy) 所有 observer 的方法 ;
// 産品類別 可供 Jsp 直接使用 UseBean 呼叫 該類別主要執行産品資料庫插入 更新 private String name; public String getName(){ return name;} } public float getPrice(){ return price;} } } |
我們注意到 , 在 product 類別中 的 setXXX 方法中 , 我們設置了 notify( 通知 ) 方法 , 當 Jsp 表單呼叫 setXXX( 如何呼叫見我的 另外一篇文章 ), 實際上就觸發了 notisfyObservers 方法 , 這將通知相應觀察者應該採取行動了。
下面看看這些觀察者的代碼 , 他們究竟採取了什麽行動 :
// 觀察者 NameObserver 主要用來對産品名稱 (name) 進行觀察的 public class NameObserver implements Observer{ private String name=null; public void update(Observable obj,Object arg){ name=(String)arg; } } } // 觀察者 PriceObserver 主要用來對産品價格 (price) 進行觀察的 private float price=0; public void update(Observable obj,Object arg){ price=((Float)arg).floatValue(); } } } |
Jsp 中我們可以來正式執行這段觀察者程式 :
<jsp:useBean id="product" scope="session" class="Product" /> <jsp:setProperty name="product" property="*" /> <jsp:useBean id="nameobs" scope="session" class="NameObserver" /> <jsp:useBean id="priceobs" scope="session" class="PriceObserver" /> <% }else{ %> //request.getRequestURI() 是産生本 jsp 的程式名 , 就是自己呼叫自己 <input type=hidden name="save" value="1"> </form> <% %>
|
執行改 Jsp 程式 , 會出現一個表單錄入介面 , 需要輸入産品名稱 産品價格 , 點按 Submit 後 , 還是執行該 jsp 的
if (request.getParameter("save")!=null) 之間的代碼。
由於這裏使用了資料 javabeans 的自動賦值概念 , 實際程式自動執行了 setName setPrice 語句。你會在伺服器控制臺中發現下面資訊 ::
NameObserver :name changet to ?????(Jsp 表單中輸入的産品名稱 )
PriceObserver :price changet to ???(Jsp 表單中輸入的産品價格 );
這說明觀察者已經在行動了 .!!
同時你會在執行 jsp 的瀏覽器端得到資訊 :
産品資料變動 保存 ! 並已經自動通知客戶
上文由於使用 jsp 概念 , 隱含很多自動動作 , 現將呼叫觀察者的 Java 代碼寫如下 :
public class Test { public static void main(String args[]){ Product product=new Product(); // 加入觀察者 product.setName(" 橘子紅了 "); } }
|
你會在發現下面資訊 ::
NameObserver :name changet to 橘子紅了
PriceObserver :price changet to 9.22
這說明觀察者在行動了 .!!