設計模式之Observer

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 呼叫 該類別主要執行産品資料庫插入 更新
public class product extends Observable{

   private String name;
   private float price;

   public String getName(){ return name;}
  
public void setName(){
  
this.name=name;
   // 設置變化點
  
setChanged();
   notifyObservers(name);

   }    

   public float getPrice(){ return price;}
  
public void setPrice(){
  
this.price=price;
   // 設置變化點
  
setChanged();
   notifyObservers(new Float(price));

   }

   // 以下可以是資料庫更新 插入命令
.
  
public void saveToDb(){
   .....................

}


我們注意到 , product 類別中 setXXX 方法中 , 我們設置了 notify( 通知 ) 方法 , Jsp 表單呼叫 setXXX( 如何呼叫見我的 另外一篇文章 ), 實際上就觸發了 notisfyObservers 方法 , 這將通知相應觀察者應該採取行動了。

下面看看這些觀察者的代碼 , 他們究竟採取了什麽行動 :

// 觀察者 NameObserver 主要用來對産品名稱 (name) 進行觀察的
public class NameObserver implements Observer{

   private String name=null;

   public void update(Observable obj,Object arg){

     if (arg instanceof String){

     name=(String)arg;
     // 産品名稱改變值在 name
     System.out.println("NameObserver :name changet to "+name);

     }

   }

}

// 觀察者 PriceObserver 主要用來對産品價格 (price) 進行觀察的
public class PriceObserver implements Observer{

   private float price=0;

   public void update(Observable obj,Object arg){

     if (arg instanceof Float){

     price=((Float)arg).floatValue();
  
     System.out.println("PriceObserver :price changet to "+price);

     }

   }

}


Jsp
中我們可以來正式執行這段觀察者程式 :

<jsp:useBean id="product" scope="session" class="Product" />
<jsp:setProperty name="product" property="*" />

<jsp:useBean id="nameobs" scope="session" class="NameObserver" />
<jsp:setProperty name="product" property="*" />

<jsp:useBean id="priceobs" scope="session" class="PriceObserver" />
<jsp:setProperty name="product" property="*" />

<%

if (request.getParameter("save")!=null)
{
  
product.saveToDb();


   out.println(" 産品資料變動 保存 ! 並已經自動通知客戶 ");

}else{

   // 加入觀察者
  
product.addObserver(nameobs );

   product.addObserver(priceobs );

%>

   //request.getRequestURI() 是産生本 jsp 的程式名 , 就是自己呼叫自己
   <form action="<%=request.getRequestURI()%>" method=post>

   <input type=hidden name="save" value="1">
  産品名稱
:<input type=text name="name" >
  産品價格
:<input type=text name="price">
   <input type=submit>

   </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();

NameObserver nameobs=new NameObserver();
PriceObserver priceobs=new PriceObserver();

// 加入觀察者
product.addObserver(nameobs);
product.addObserver(priceobs);

product.setName(" 橘子紅了 ");
product.setPrice(9.22f);

   }

}

 

 

 

你會在發現下面資訊 ::

NameObserver :name changet to 橘子紅了

PriceObserver :price changet to 9.22

這說明觀察者在行動了 .!!

你可能感兴趣的:(jsp)