Observer(觀察者)模式是比較常用的一個(gè)模式,尤其在界面設(shè)計(jì)中應(yīng)用廣泛,而本站所關(guān)注的是Java 在電子商務(wù)系統(tǒng)中應(yīng)用,因此想從電子商務(wù)實(shí)例中分析Observer 的應(yīng)用。
雖然網(wǎng)上商店形式多樣,每個(gè)站點(diǎn)有自己的特色,但也有其一般的共性,單就“商品的變化,以便及時(shí)通知訂戶”這一點(diǎn),是很多網(wǎng)上商店共有的模式,這一模式類似Observer patern。
具體的說(shuō),如果網(wǎng)上商店中商品在名稱價(jià)格等方面有變化,如果系統(tǒng)能自動(dòng)通知會(huì)員,將是網(wǎng)上商店區(qū)別傳統(tǒng)商店的一大特色。這就需要在商品product 中加入Observer 這樣角色,以便product 細(xì)節(jié)發(fā)生變化時(shí),Observer 能自動(dòng)觀察到這種變化,并能進(jìn)行及時(shí)的update 或notify 動(dòng)作。
Java 的API 還為為我們提供現(xiàn)成的Observer 接口Java.util.Observer。我們只要直接使用它就可以。
我們必須extends Java.util.Observer 才能真正使用它:
1.提供Add/Delete observer 的方法;
2.提供通知(notisfy) 所有observer 的方法;
//產(chǎn)品類:可供Jsp 直接使用UseBean 調(diào)用,該類主要執(zhí)行產(chǎn)品數(shù)據(jù)庫(kù)插入更新。
public class product extends Observable{
private String name;
private float price;
public String getName(){
return name;
}
public void setName(){
this.name=name;
//設(shè)置變化點(diǎn)
setChanged();
notifyObservers(name);
}
public float getPrice(){
return price;
}
public void setPrice(){
this.price=price;
//設(shè)置變化點(diǎn)
setChanged();
notifyObservers(new Float(price));
}
//以下可以是數(shù)據(jù)庫(kù)更新 插入命令。
public void saveToDb(){
.....................
}
我們注意到,在product 類中 的setXXX 方法中,我們?cè)O(shè)置了 notify(通知)方法,當(dāng)Jsp 表單調(diào)用setXXX(如何調(diào)用見(jiàn)我的另外一篇文章),實(shí)際上就觸發(fā)了notisfyObservers 方法,這將通知相應(yīng)觀察者應(yīng)該采取行動(dòng)了。
下面看看這些觀察者的代碼,他們究竟采取了什么行動(dòng):
//觀察者NameObserver 主要用來(lái)對(duì)產(chǎn)品名稱(name)進(jìn)行觀察的。
public class NameObserver implements Observer{
private String name=null;
public void update(Observable obj,Object arg){
if (arg instanceof String){
name=(String)arg;
//產(chǎn)品名稱改變值在name 中。
System.out.println("NameObserver :name changet to "+name);
}
}
}
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |