摘 要: 在電子商務(wù)的大背景下,為了便于客戶網(wǎng)購后對貨物進(jìn)行跟蹤和實(shí)施個(gè)性化查詢,必須建立一個(gè)便于擴(kuò)展和維護(hù)的靈活的電子商務(wù)網(wǎng)站物流查詢系統(tǒng),因此,在系統(tǒng)設(shè)計(jì)過程中引入觀察者設(shè)計(jì)模式中的“拉”數(shù)據(jù)模型。文章介紹了觀察者模式,提出了觀察者模式中的“拉”數(shù)據(jù)模型應(yīng)用到電子商務(wù)物流系統(tǒng)中的思路和方法,給出了UML模型及具體的實(shí)現(xiàn)過程。實(shí)踐證明,基于觀察者模式的“拉”數(shù)據(jù)模型在具體主題和具體觀察者之間建立起一個(gè)松耦合關(guān)系,充分滿足了面向?qū)ο蟮摹伴_閉原則”,且實(shí)現(xiàn)了客戶的個(gè)性化查詢,使得系統(tǒng)的質(zhì)量和開發(fā)效率都得到了很大的提升。
關(guān)鍵詞: 觀察者模式; 電子商務(wù)物流; UML類圖; 面向?qū)ο?/p>
中圖分類號:TP391 文獻(xiàn)標(biāo)志碼:A 文章編號: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)站購買物品后,在貨物配送的過程中,貨物物流查詢成為網(wǎng)購者普遍關(guān)心的問題之一。按照傳統(tǒng)電子商務(wù)物流系統(tǒng)設(shè)計(jì)方案:在物流查詢邏輯等類內(nèi)部增加相關(guān)代碼,進(jìn)而完成通知消費(fèi)者貨物送達(dá)地點(diǎn)、快遞公司信息等各種邏輯。此種設(shè)計(jì)方案由于程序間是“緊耦合”關(guān)系,致使一旦某個(gè)物流查詢邏輯發(fā)生改變,便需要修改相關(guān)的核心文件,日積月累后,導(dǎo)致文件冗長,不利于系統(tǒng)的維護(hù)和擴(kuò)展[1]。
觀察者(Observer)模式作為“模式中的皇后”,是Java程序設(shè)計(jì)中應(yīng)用最為廣泛也最為靈活的設(shè)計(jì)模式之一,在現(xiàn)實(shí)應(yīng)用系統(tǒng)中有著廣泛應(yīng)用。觀察者模式設(shè)計(jì)——“拉數(shù)據(jù)”方式不僅實(shí)現(xiàn)了表示層和數(shù)據(jù)邏輯層的分離,在具體主題和具體觀察者之間建立起一個(gè)松耦合關(guān)系,而且可以在具體觀察者得到通知后,調(diào)用具體主題提供的方法得到數(shù)據(jù),由觀察者根據(jù)需要“拉取”數(shù)據(jù)獲取信息,既有利于系統(tǒng)的維護(hù)和擴(kuò)展,又能避免具體主題向觀察者推送不需要的信息,體現(xiàn)出系統(tǒng)設(shè)計(jì)的個(gè)性化和人性化。本文基于觀察者模式——“拉”數(shù)據(jù)方式及支持廣播通信的特性,結(jié)合實(shí)例,分析其在電子商務(wù)物流系統(tǒng)設(shè)計(jì)中的典型應(yīng)用[2]。
1 觀察者模式
1.1 觀察者模式的結(jié)構(gòu)
觀察者模式(Observer)定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個(gè)對象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對象都得到通知并被自動(dòng)更新[3]。當(dāng)主題對象狀態(tài)發(fā)生變化時(shí),通知所有的觀察者對象,使得觀察者能夠自動(dòng)更新自己。觀察者模式有時(shí)也稱為發(fā)布-訂閱( Publish-Subscribe)模式,即:觀察者訂閱主題的消息,主題在事件發(fā)生時(shí)廣播這些消息。如果某個(gè)對象的事件需要告知其他對象,同時(shí)又不想讓前者了解后者的太多信息,就可以使用該模式。觀察者模式的靜態(tài)結(jié)構(gòu)類如圖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 觀察者模式結(jié)構(gòu)類圖
觀察者模式由抽象主題、抽象觀察者、具體主題,具體觀察者四類角色組成。
⑴ 主題(Subject)為接口,該接口規(guī)定了具體主題需要實(shí)現(xiàn)的方法,如:添加、刪除觀察者及通知觀察者更新數(shù)據(jù)的方法。
⑵ 抽象觀察者(Observer)為一個(gè)接口,該接口規(guī)定了具體觀察者用來更新數(shù)據(jù)的方法。
⑶ 具體主題(ConcreteSubject)為Observer的具體實(shí)現(xiàn),該實(shí)例包含有可以經(jīng)常發(fā)生變化的數(shù)據(jù),具體主題使用一個(gè)集合存放觀察者的引用,以便數(shù)據(jù)變化時(shí)通知具體觀察者。
⑷ 具體觀察者(ConcreteObserver)為實(shí)現(xiàn)具體觀察者接口類的一個(gè)實(shí)例,其中可以存放具體主題引用的主題接口變量,可以讓具體主題將自己的引用添加到具體主題集合中,使自己成為它的觀察者或者讓此具體主題將自己從具體主題集合中移除,不再成為具體觀察者[5]。
觀察者模式支持廣播通訊,被觀察者會向所有登記過的觀察者發(fā)出通知;此外,觀察者模式在被觀察者和觀察者之間建立起松耦合關(guān)系,觀察者模式的這種“針對抽象編程”的做法體現(xiàn)了面向?qū)ο笤O(shè)計(jì)復(fù)用原則中的“依賴倒轉(zhuǎn)原則”,可以有效減少模塊間的“緊耦合”,有利于提高系統(tǒng)的可維護(hù)性和擴(kuò)展性[6]。
1.2 觀察者模式的兩種方式
觀察者模式有兩種獲得數(shù)據(jù)的模式:“推”數(shù)據(jù)和“拉”數(shù)據(jù)。推數(shù)據(jù)方式中,當(dāng)消息更新時(shí),不管觀察者對這些信息需要與否,具體主題都會將相關(guān)信息通過參數(shù)的形式推送給觀察者;拉數(shù)據(jù)方式中,當(dāng)消息更新時(shí),具體觀察者得到通知后,具體主題不會將變化后的數(shù)據(jù)交給具體觀察者,而是調(diào)用具體主題提供的方法得到數(shù)據(jù),即由觀察者根據(jù)需要“拉取”數(shù)據(jù)。
2 觀察者模式中的“拉數(shù)據(jù)”方式在電子商務(wù)物流系統(tǒng)設(shè)計(jì)中的應(yīng)用
2.1 問題場景
消費(fèi)者在電子商務(wù)網(wǎng)站購買物品后,電子商務(wù)網(wǎng)站作為網(wǎng)購第三方平臺,會發(fā)布物流公司反饋的貨物當(dāng)前到達(dá)地點(diǎn)、所選取的快遞公司等相關(guān)物流信息。例如,現(xiàn)有兩位消費(fèi)者對物流信息較感興趣,一位消費(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)。如果采用基于觀察者模式的“推”數(shù)據(jù)方式進(jìn)行系統(tǒng)設(shè)計(jì),則當(dāng)消息更新時(shí),不管消費(fèi)者對這些信息需要與否,電子商務(wù)網(wǎng)站都會將物流公司反饋的物流信息通過參數(shù)的形式“推送”給消費(fèi)者,而采用“拉”數(shù)據(jù)方式設(shè)計(jì)系統(tǒng),則當(dāng)消息更新時(shí),電子商務(wù)網(wǎng)站不會將變化后的數(shù)據(jù)推給消費(fèi)者,而是由消費(fèi)者根據(jù)需要“拉取”信息。
2.2 基于“拉”模型的系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
對于上述問題,兩位消費(fèi)者為具體觀察者,而相關(guān)的電子商務(wù)網(wǎng)站即為他們所依賴的一個(gè)具體主題。按照觀察者模式的結(jié)構(gòu),系統(tǒng)類圖如圖2所示。
[<
Subject][<
Observer][LogisticSubject\網(wǎng)購平臺(物流信息發(fā)布方)\][CustomerOne\消費(fèi)者1\][CustomerTwo\消費(fèi)者2\] [通知][通知]
圖2 物流信息發(fā)布方與消費(fèi)者
⑴ 抽象主題
定義一個(gè)Subject接口,規(guī)定具體主題需要實(shí)現(xiàn)的三個(gè)抽象方法,用來添加、刪除觀察者及通知觀察者更新數(shù)據(jù)。主題接口Subject代碼如下:
public interface Subject {
public void ResisterObserver(Observer o);
public void UnResisterObserver(Observer o);
public void notifyObserver(); }
⑵ 抽象觀察者
設(shè)計(jì)觀察者Observer接口,規(guī)定了具體觀察者用來更新數(shù)據(jù)的方法,對于本問題,規(guī)定具體主題不將變化后的數(shù)據(jù)通過update()方法交給具體觀察者,而是提供了獲取這些數(shù)據(jù)的方法,由觀察者根據(jù)需要“拉取”信息。觀察者接口Observer代碼如下:
public interface Observer { public void update(); }
⑶ 具體主題LogisticSubject
對于本問題,物流公司為具體主題,由于電子商務(wù)物流信息發(fā)布平臺不清楚它的觀察者是否對全部物流信息都感興趣,因此允許觀察者采用拉數(shù)據(jù)的方式獲得信息,即在應(yīng)用notifyObserver()方法通知觀察者時(shí),僅僅通知觀察者執(zhí)行更新操作而不直接提供數(shù)據(jù)。具體主題類LogisticSubject的部分代碼如下:
public class LogisticSubject implements Subject {
public LogisticSubject() {
personlist=new ArrayList
}
public void notifyObserver() {
for(Observer o:personlist) {
o.update(); //通知觀察者執(zhí)行更新操作,但不提供數(shù)據(jù) } } }
⑷ 具體觀察者
在本問題中,消費(fèi)者為具體觀察者,創(chuàng)建的具體觀察者類分別為:CustomerOne和CustomerTwo。CustomOne創(chuàng)建的觀察者只關(guān)心貨物當(dāng)前到達(dá)的地點(diǎn),CustomerTwo只關(guān)心商家選取的物流配送公司的相關(guān)信息。CustomerOne和CustomerTwo類部分代碼如下:
CustomerOne.java
public class CustomerOne implements Observer {
Subject subject;
public CustomerOne(Subject subject,String personnanme) {
subject.ResisterObserver(this); //使當(dāng)前實(shí)例成為具體主題的觀察者 }
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 測試結(jié)果分析
測試類Application.java使用了觀察者模式中涉及的類,通過具體主題subject給出新信息,具體觀察者zhangsan和lisi根據(jù)需要調(diào)用具體主題提供的方法獲取自己感興趣的物流信息。Application.java演示了兩個(gè)顧客根據(jù)需要獲取自己所需要的物流信息的過程,具體代碼及如下:
3 結(jié)束語
通過對觀察者模式在電子商務(wù)系統(tǒng)中的應(yīng)用研究可以發(fā)現(xiàn),基于Java的觀察者模式設(shè)計(jì)方式,在具體主題和具體觀察者之間建立起一個(gè)松耦合關(guān)系,在模塊之間劃定了清晰的界限,滿足程序設(shè)計(jì)的“開閉原則”,提高了應(yīng)用程序的可維護(hù)性和重用性。觀察者模式——“拉”模型不僅支持廣播通信,而且可以由觀察者根據(jù)需要“拉取”數(shù)據(jù),體現(xiàn)了系統(tǒng)設(shè)計(jì)的個(gè)性化和人性化。將基于觀察者模式的“拉”數(shù)據(jù)模型應(yīng)用到電子商務(wù)網(wǎng)站物流查詢系統(tǒng)中,不僅使系統(tǒng)變得易于維護(hù)和擴(kuò)展,而且便于客戶進(jìn)行貨物跟蹤、實(shí)施個(gè)性化查詢,有助于提升服務(wù)質(zhì)量,吸引和留住客戶,具有較強(qiáng)的理論和實(shí)踐意義,對電子商務(wù)行業(yè)的發(fā)展具有深遠(yuǎn)影響。隨著電子商務(wù)的不斷普及和應(yīng)用深化,相信觀察者模式將在電子商務(wù)系統(tǒng)設(shè)計(jì)中發(fā)揮越來越重要的作用。
參考文獻(xiàn):
[1] 王曉平.電子商務(wù)物流[M].上海交通大學(xué)出版社,2010.
[2] 馮新?lián)P,沈建京,姚松林.基于ASP.NET的觀察者模式應(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天—觀察者模式[OB/OL].http://www.
ymsky.net/views/135308.shtml.2014.4.23.
[5] 耿祥義,張躍平.Java設(shè)計(jì)模式[M].清華大學(xué)出版社,2009.
[6] 歐陽宏基,楊衛(wèi)忠,趙薔.觀察者模式在Java事件處理中的應(yīng)用研究[J].
微處理機(jī),2013.4:77