摘 要: 在電子商務(wù)的大背景下,為了便于客戶(hù)網(wǎng)購(gòu)后對(duì)貨物進(jìn)行跟蹤和實(shí)施個(gè)性化查詢(xún),必須建立一個(gè)便于擴(kuò)展和維護(hù)的靈活的電子商務(wù)網(wǎng)站物流查詢(xún)系統(tǒng),因此,在系統(tǒng)設(shè)計(jì)過(guò)程中引入觀(guān)察者設(shè)計(jì)模式中的“拉”數(shù)據(jù)模型。文章介紹了觀(guān)察者模式,提出了觀(guān)察者模式中的“拉”數(shù)據(jù)模型應(yīng)用到電子商務(wù)物流系統(tǒng)中的思路和方法,給出了UML模型及具體的實(shí)現(xiàn)過(guò)程。實(shí)踐證明,基于觀(guān)察者模式的“拉”數(shù)據(jù)模型在具體主題和具體觀(guān)察者之間建立起一個(gè)松耦合關(guān)系,充分滿(mǎn)足了面向?qū)ο蟮摹伴_(kāi)閉原則”,且實(shí)現(xiàn)了客戶(hù)的個(gè)性化查詢(xún),使得系統(tǒng)的質(zhì)量和開(kāi)發(fā)效率都得到了很大的提升。
關(guān)鍵詞: 觀(guān)察者模式; 電子商務(wù)物流; UML類(lèi)圖; 面向?qū)ο?/p>
中圖分類(lèi)號(hào):TP391 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2014)09-49-03
Application of \"pull\" model of observer design pattern into electronic commerce system
Chen Pingping, Yu Weihong, Chen Yan
(Transportation Management College Dalian Maritime University, Dalian, Liaoning 116026, China)
Abstract: Under the background of e-commerce, in order to facilitate customers' tracking and personally querying after shopping, a flexible e-commerce logistics query system convenient for extension and maintenance must be established. The data model \"pull\" in the observer design pattern is introduced into system design process. The ideas and the methods of applying \"pull\" in electronic commerce logistics are introduced. The UML mode and the specific implementation process are given. The practice has proved that the \"pull\" data model based on the observer pattern set up a loose coupling relationship in the specific topic and specific observer. It fully satisfies the object-oriented \"open closed principle\", implements the personalized customer inquiries and improves quality and development efficiency.
Key words: observer design pattern; electronic commerce logistics; UML class diagram; object-oriented
0 引言
消費(fèi)者在電子商務(wù)網(wǎng)站購(gòu)買(mǎi)物品后,在貨物配送的過(guò)程中,貨物物流查詢(xún)成為網(wǎng)購(gòu)者普遍關(guān)心的問(wèn)題之一。按照傳統(tǒng)電子商務(wù)物流系統(tǒng)設(shè)計(jì)方案:在物流查詢(xún)邏輯等類(lèi)內(nèi)部增加相關(guān)代碼,進(jìn)而完成通知消費(fèi)者貨物送達(dá)地點(diǎn)、快遞公司信息等各種邏輯。此種設(shè)計(jì)方案由于程序間是“緊耦合”關(guān)系,致使一旦某個(gè)物流查詢(xún)邏輯發(fā)生改變,便需要修改相關(guān)的核心文件,日積月累后,導(dǎo)致文件冗長(zhǎng),不利于系統(tǒng)的維護(hù)和擴(kuò)展[1]。
觀(guān)察者(Observer)模式作為“模式中的皇后”,是Java程序設(shè)計(jì)中應(yīng)用最為廣泛也最為靈活的設(shè)計(jì)模式之一,在現(xiàn)實(shí)應(yīng)用系統(tǒng)中有著廣泛應(yīng)用。觀(guān)察者模式設(shè)計(jì)——“拉數(shù)據(jù)”方式不僅實(shí)現(xiàn)了表示層和數(shù)據(jù)邏輯層的分離,在具體主題和具體觀(guān)察者之間建立起一個(gè)松耦合關(guān)系,而且可以在具體觀(guān)察者得到通知后,調(diào)用具體主題提供的方法得到數(shù)據(jù),由觀(guān)察者根據(jù)需要“拉取”數(shù)據(jù)獲取信息,既有利于系統(tǒng)的維護(hù)和擴(kuò)展,又能避免具體主題向觀(guān)察者推送不需要的信息,體現(xiàn)出系統(tǒng)設(shè)計(jì)的個(gè)性化和人性化。本文基于觀(guān)察者模式——“拉”數(shù)據(jù)方式及支持廣播通信的特性,結(jié)合實(shí)例,分析其在電子商務(wù)物流系統(tǒng)設(shè)計(jì)中的典型應(yīng)用[2]。
1 觀(guān)察者模式
1.1 觀(guān)察者模式的結(jié)構(gòu)
觀(guān)察者模式(Observer)定義對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都得到通知并被自動(dòng)更新[3]。當(dāng)主題對(duì)象狀態(tài)發(fā)生變化時(shí),通知所有的觀(guān)察者對(duì)象,使得觀(guān)察者能夠自動(dòng)更新自己。觀(guān)察者模式有時(shí)也稱(chēng)為發(fā)布-訂閱( Publish-Subscribe)模式,即:觀(guān)察者訂閱主題的消息,主題在事件發(fā)生時(shí)廣播這些消息。如果某個(gè)對(duì)象的事件需要告知其他對(duì)象,同時(shí)又不想讓前者了解后者的太多信息,就可以使用該模式。觀(guān)察者模式的靜態(tài)結(jié)構(gòu)類(lèi)如圖1所示[4]。
[<
Subject\+ResisterObserver(Observer)():void
+UnResisterObserver():void
+notifyObserver():void\][ConcreteSubject\\+ResisterObserver(Observer)():void
+UnResisterObserver():void
+notifyObserver():void
+otherMetond():void\][<
Observer\+update():void\][ConcreteObserver\+subject:Subject\+update():void\]
圖1 觀(guān)察者模式結(jié)構(gòu)類(lèi)圖
觀(guān)察者模式由抽象主題、抽象觀(guān)察者、具體主題,具體觀(guān)察者四類(lèi)角色組成。
⑴ 主題(Subject)為接口,該接口規(guī)定了具體主題需要實(shí)現(xiàn)的方法,如:添加、刪除觀(guān)察者及通知觀(guān)察者更新數(shù)據(jù)的方法。
⑵ 抽象觀(guān)察者(Observer)為一個(gè)接口,該接口規(guī)定了具體觀(guān)察者用來(lái)更新數(shù)據(jù)的方法。
⑶ 具體主題(ConcreteSubject)為Observer的具體實(shí)現(xiàn),該實(shí)例包含有可以經(jīng)常發(fā)生變化的數(shù)據(jù),具體主題使用一個(gè)集合存放觀(guān)察者的引用,以便數(shù)據(jù)變化時(shí)通知具體觀(guān)察者。
⑷ 具體觀(guān)察者(ConcreteObserver)為實(shí)現(xiàn)具體觀(guān)察者接口類(lèi)的一個(gè)實(shí)例,其中可以存放具體主題引用的主題接口變量,可以讓具體主題將自己的引用添加到具體主題集合中,使自己成為它的觀(guān)察者或者讓此具體主題將自己從具體主題集合中移除,不再成為具體觀(guān)察者[5]。
觀(guān)察者模式支持廣播通訊,被觀(guān)察者會(huì)向所有登記過(guò)的觀(guān)察者發(fā)出通知;此外,觀(guān)察者模式在被觀(guān)察者和觀(guān)察者之間建立起松耦合關(guān)系,觀(guān)察者模式的這種“針對(duì)抽象編程”的做法體現(xiàn)了面向?qū)ο笤O(shè)計(jì)復(fù)用原則中的“依賴(lài)倒轉(zhuǎn)原則”,可以有效減少模塊間的“緊耦合”,有利于提高系統(tǒng)的可維護(hù)性和擴(kuò)展性[6]。
1.2 觀(guān)察者模式的兩種方式
觀(guān)察者模式有兩種獲得數(shù)據(jù)的模式:“推”數(shù)據(jù)和“拉”數(shù)據(jù)。推數(shù)據(jù)方式中,當(dāng)消息更新時(shí),不管觀(guān)察者對(duì)這些信息需要與否,具體主題都會(huì)將相關(guān)信息通過(guò)參數(shù)的形式推送給觀(guān)察者;拉數(shù)據(jù)方式中,當(dāng)消息更新時(shí),具體觀(guān)察者得到通知后,具體主題不會(huì)將變化后的數(shù)據(jù)交給具體觀(guān)察者,而是調(diào)用具體主題提供的方法得到數(shù)據(jù),即由觀(guān)察者根據(jù)需要“拉取”數(shù)據(jù)。
2 觀(guān)察者模式中的“拉數(shù)據(jù)”方式在電子商務(wù)物流系統(tǒng)設(shè)計(jì)中的應(yīng)用
2.1 問(wèn)題場(chǎng)景
消費(fèi)者在電子商務(wù)網(wǎng)站購(gòu)買(mǎi)物品后,電子商務(wù)網(wǎng)站作為網(wǎng)購(gòu)第三方平臺(tái),會(huì)發(fā)布物流公司反饋的貨物當(dāng)前到達(dá)地點(diǎn)、所選取的快遞公司等相關(guān)物流信息。例如,現(xiàn)有兩位消費(fèi)者對(duì)物流信息較感興趣,一位消費(fèi)者只關(guān)心當(dāng)前時(shí)間及貨物當(dāng)前送達(dá)地點(diǎn),并不關(guān)心商家選取的物流公司信息,而另一位消費(fèi)者只關(guān)心商家選取的物流公司信息,并不關(guān)心貨物當(dāng)前送達(dá)地點(diǎn)。如果采用基于觀(guān)察者模式的“推”數(shù)據(jù)方式進(jìn)行系統(tǒng)設(shè)計(jì),則當(dāng)消息更新時(shí),不管消費(fèi)者對(duì)這些信息需要與否,電子商務(wù)網(wǎng)站都會(huì)將物流公司反饋的物流信息通過(guò)參數(shù)的形式“推送”給消費(fèi)者,而采用“拉”數(shù)據(jù)方式設(shè)計(jì)系統(tǒng),則當(dāng)消息更新時(shí),電子商務(wù)網(wǎng)站不會(huì)將變化后的數(shù)據(jù)推給消費(fèi)者,而是由消費(fèi)者根據(jù)需要“拉取”信息。
2.2 基于“拉”模型的系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
對(duì)于上述問(wèn)題,兩位消費(fèi)者為具體觀(guān)察者,而相關(guān)的電子商務(wù)網(wǎng)站即為他們所依賴(lài)的一個(gè)具體主題。按照觀(guān)察者模式的結(jié)構(gòu),系統(tǒng)類(lèi)圖如圖2所示。
[<
Subject][<
Observer][LogisticSubject\網(wǎng)購(gòu)平臺(tái)(物流信息發(fā)布方)\][CustomerOne\消費(fèi)者1\][CustomerTwo\消費(fèi)者2\] [通知][通知]
圖2 物流信息發(fā)布方與消費(fèi)者
⑴ 抽象主題
定義一個(gè)Subject接口,規(guī)定具體主題需要實(shí)現(xiàn)的三個(gè)抽象方法,用來(lái)添加、刪除觀(guān)察者及通知觀(guān)察者更新數(shù)據(jù)。主題接口Subject代碼如下:
public interface Subject {
public void ResisterObserver(Observer o);
public void UnResisterObserver(Observer o);
public void notifyObserver(); }
⑵ 抽象觀(guān)察者
設(shè)計(jì)觀(guān)察者Observer接口,規(guī)定了具體觀(guān)察者用來(lái)更新數(shù)據(jù)的方法,對(duì)于本問(wèn)題,規(guī)定具體主題不將變化后的數(shù)據(jù)通過(guò)update()方法交給具體觀(guān)察者,而是提供了獲取這些數(shù)據(jù)的方法,由觀(guān)察者根據(jù)需要“拉取”信息。觀(guān)察者接口Observer代碼如下:
public interface Observer { public void update(); }
⑶ 具體主題LogisticSubject
對(duì)于本問(wèn)題,物流公司為具體主題,由于電子商務(wù)物流信息發(fā)布平臺(tái)不清楚它的觀(guān)察者是否對(duì)全部物流信息都感興趣,因此允許觀(guān)察者采用拉數(shù)據(jù)的方式獲得信息,即在應(yīng)用notifyObserver()方法通知觀(guān)察者時(shí),僅僅通知觀(guān)察者執(zhí)行更新操作而不直接提供數(shù)據(jù)。具體主題類(lèi)LogisticSubject的部分代碼如下:
public class LogisticSubject implements Subject {
public LogisticSubject() {
personlist=new ArrayList
}
public void notifyObserver() {
for(Observer o:personlist) {
o.update(); //通知觀(guān)察者執(zhí)行更新操作,但不提供數(shù)據(jù) } } }
⑷ 具體觀(guān)察者
在本問(wèn)題中,消費(fèi)者為具體觀(guān)察者,創(chuàng)建的具體觀(guān)察者類(lèi)分別為:CustomerOne和CustomerTwo。CustomOne創(chuàng)建的觀(guān)察者只關(guān)心貨物當(dāng)前到達(dá)的地點(diǎn),CustomerTwo只關(guān)心商家選取的物流配送公司的相關(guān)信息。CustomerOne和CustomerTwo類(lèi)部分代碼如下:
CustomerOne.java
public class CustomerOne implements Observer {
Subject subject;
public CustomerOne(Subject subject,String personnanme) {
subject.ResisterObserver(this); //使當(dāng)前實(shí)例成為具體主題的觀(guān)察者 }
public void update() { if(subject instanceof LogisticSubject) {
String msg1=((LogisticSubject)subject).getGoodsmsg1(); } } }
CustomeraTwo.java
public class CustomerTwo implements Observer {
//部分代碼同CustomOne
String msg2=((LogisticSubject)subject).getGoodsmsg2(); }
2.3 測(cè)試結(jié)果分析
測(cè)試類(lèi)Application.java使用了觀(guān)察者模式中涉及的類(lèi),通過(guò)具體主題subject給出新信息,具體觀(guān)察者zhangsan和lisi根據(jù)需要調(diào)用具體主題提供的方法獲取自己感興趣的物流信息。Application.java演示了兩個(gè)顧客根據(jù)需要獲取自己所需要的物流信息的過(guò)程,具體代碼及如下:
3 結(jié)束語(yǔ)
通過(guò)對(duì)觀(guān)察者模式在電子商務(wù)系統(tǒng)中的應(yīng)用研究可以發(fā)現(xiàn),基于Java的觀(guān)察者模式設(shè)計(jì)方式,在具體主題和具體觀(guān)察者之間建立起一個(gè)松耦合關(guān)系,在模塊之間劃定了清晰的界限,滿(mǎn)足程序設(shè)計(jì)的“開(kāi)閉原則”,提高了應(yīng)用程序的可維護(hù)性和重用性。觀(guān)察者模式——“拉”模型不僅支持廣播通信,而且可以由觀(guān)察者根據(jù)需要“拉取”數(shù)據(jù),體現(xiàn)了系統(tǒng)設(shè)計(jì)的個(gè)性化和人性化。將基于觀(guān)察者模式的“拉”數(shù)據(jù)模型應(yīng)用到電子商務(wù)網(wǎng)站物流查詢(xún)系統(tǒng)中,不僅使系統(tǒng)變得易于維護(hù)和擴(kuò)展,而且便于客戶(hù)進(jìn)行貨物跟蹤、實(shí)施個(gè)性化查詢(xún),有助于提升服務(wù)質(zhì)量,吸引和留住客戶(hù),具有較強(qiáng)的理論和實(shí)踐意義,對(duì)電子商務(wù)行業(yè)的發(fā)展具有深遠(yuǎn)影響。隨著電子商務(wù)的不斷普及和應(yīng)用深化,相信觀(guān)察者模式將在電子商務(wù)系統(tǒng)設(shè)計(jì)中發(fā)揮越來(lái)越重要的作用。
參考文獻(xiàn):
[1] 王曉平.電子商務(wù)物流[M].上海交通大學(xué)出版社,2010.
[2] 馮新?lián)P,沈建京,姚松林.基于A(yíng)SP.NET的觀(guān)察者模式應(yīng)用研究[J].
Computer Applications and Sottware,2008.11:172
[3] Erich Gamma,Richard Helm,Ralph Johnson著,李英軍,馬曉星,蔡
敏等譯.設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].機(jī)械工業(yè)出版社,2005.
[4] 《JAVA與模式》第18天—觀(guān)察者模式[OB/OL].http://www.
ymsky.net/views/135308.shtml.2014.4.23.
[5] 耿祥義,張躍平.Java設(shè)計(jì)模式[M].清華大學(xué)出版社,2009.
[6] 歐陽(yáng)宏基,楊衛(wèi)忠,趙薔.觀(guān)察者模式在Java事件處理中的應(yīng)用研究[J].
微處理機(jī),2013.4:77