方雅婧,饒浩,于衛(wèi)紅,陳燕
裝飾者模式在定制化電子商務(wù)中的應(yīng)用
方雅婧,饒浩,于衛(wèi)紅,陳燕
隨著電子商務(wù)的發(fā)展,消費(fèi)者開(kāi)始不滿足于單一不變的商品,定制化的電子商務(wù)逐漸興起。分析了現(xiàn)有電子商務(wù)系統(tǒng)中定制化實(shí)現(xiàn)的不足,提出了將裝飾者設(shè)計(jì)模式應(yīng)用到電子商務(wù)定制化系統(tǒng)設(shè)計(jì)中的思路和方法。通過(guò)實(shí)例,比較了完全繼承機(jī)制與裝飾者模式的優(yōu)劣,說(shuō)明了裝飾者模式在軟件可擴(kuò)展性和可維護(hù)性中的作用。
裝飾者模式;定制化;電子商務(wù);系統(tǒng)設(shè)計(jì)
20世紀(jì)90年代,基于萬(wàn)維網(wǎng)的互聯(lián)網(wǎng)技術(shù)突飛猛進(jìn),進(jìn)而使得商務(wù)活動(dòng)電子化的想法逐步成熟,而后互聯(lián)網(wǎng)開(kāi)始真正應(yīng)用于商業(yè)交易,電子商務(wù)也日益蓬勃發(fā)展起來(lái)[1]。
隨著競(jìng)爭(zhēng)的激烈、銷售的微利、消費(fèi)的疲態(tài),傳統(tǒng)電商正面臨著轉(zhuǎn)型的壓力?,F(xiàn)在的消費(fèi)者,在對(duì)便捷快速的網(wǎng)購(gòu)習(xí)以為常之后,開(kāi)始追求能凸顯自我的個(gè)性化?;ヂ?lián)網(wǎng)本身的互動(dòng)性使人們可以按照需要進(jìn)行選擇而且具有數(shù)量龐大的潛在用戶基礎(chǔ)。于是,定制化電子商務(wù)的優(yōu)點(diǎn)逐漸體現(xiàn)出來(lái)。定制化是C2B電商的一種體現(xiàn),實(shí)際上是對(duì)傳統(tǒng)B2C購(gòu)物體驗(yàn)的進(jìn)一步互動(dòng)深挖。傳統(tǒng)的B2C模式中所有環(huán)節(jié)都由廠商驅(qū)動(dòng),而C2B是由消費(fèi)者驅(qū)動(dòng),以消費(fèi)者需求為起點(diǎn),力求發(fā)掘消費(fèi)者的主動(dòng)性與積極性的一種商業(yè)模式。毋庸置疑,定制化挖掘了互聯(lián)網(wǎng)的真正潛力,是未來(lái)電子商務(wù)的發(fā)展方向[2][3]。
如何實(shí)現(xiàn)定制化、個(gè)性化是一個(gè)難題。個(gè)性化意味著消費(fèi)者的選擇不再是唯一的商品,而是不斷變化的商品。相應(yīng)的軟件系統(tǒng)要面臨著不斷增加的變化,這就要求我們?cè)O(shè)計(jì)的系統(tǒng)擁有良好的可靠性,可復(fù)用性,可拓展性和可維護(hù)性。如果不進(jìn)行設(shè)計(jì)優(yōu)化,整個(gè)系統(tǒng)務(wù)必會(huì)缺少應(yīng)對(duì)變化的能力,而設(shè)計(jì)模式可以使軟件更易修改和維護(hù)。根據(jù)定制化的特點(diǎn)(動(dòng)態(tài)地添加產(chǎn)品特性,而且可以隨時(shí)撤銷),裝飾者模式可以更好幫助我們實(shí)現(xiàn)產(chǎn)品定制。
設(shè)計(jì)模式是針對(duì)某一類問(wèn)題的最佳解決方案,而且已經(jīng)被成功應(yīng)用于許多系統(tǒng)的設(shè)計(jì)中,它解決了在某種特定情景中重復(fù)發(fā)生的某個(gè)問(wèn)題[4]。20 世紀(jì)90 年代初,Gamma、Helm、Johnson 和Vlissides 等人將建筑領(lǐng)域的模式思想引入到軟件開(kāi)發(fā)中,提出了注明的GOF23種設(shè)計(jì)模式,裝飾者模式即屬于其中之一[5]。
裝飾者模式可以動(dòng)態(tài)地給一個(gè)對(duì)象增加職責(zé)。就擴(kuò)展對(duì)象功能來(lái)說(shuō),裝飾者模式比生成子類更為靈活。
裝飾者模式適用于以下3種情況:
(1)在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加職責(zé)。
(2)處理那些可以撤銷的職責(zé)。
(3)當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時(shí)。一種情況是,可能有大量獨(dú)立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長(zhǎng)。另一種情況可能是因?yàn)轭惗x被隱藏,或類定義不能用于生成子類[6]。
裝飾者模式的類圖,如圖1所示:
圖1 裝飾者模式的類圖
·Component:定義一個(gè)對(duì)象接口,可以給這些對(duì)象動(dòng)態(tài)地添加職責(zé)。
·ConcreteComponent:定義一個(gè)對(duì)象,可以給這個(gè)對(duì)象添加一些職責(zé)。
·Decorator:維持一個(gè)指向Component對(duì)象的指針,并定義一個(gè)與Component接口一致的接口。
·ConcreteDecorator:向組件添加職責(zé)。
Decorator模式的工作原理:
可以創(chuàng)建始于Decorator對(duì)象(負(fù)責(zé)新功能的對(duì)象)終于原對(duì)象的一個(gè)對(duì)象“鏈”。
每條鏈都始于一個(gè)Component對(duì)象。每個(gè)Decorator對(duì)象后面都跟著另一個(gè)Decorator對(duì)象或原ConcreteComponent對(duì)象。對(duì)象鏈總是終于一個(gè)ConcreteComponent對(duì)象。例如在圖1中,ConcreteDecoratorB對(duì)象執(zhí)行其operation方法,然后調(diào)用Decorator類的Operation方法。這又將調(diào)用ConcreteDecoratorB對(duì)象之后的Component對(duì)象的Operation方法。[5]
2.1 問(wèn)題的提出
現(xiàn)在流行的定制化方式可分為兩種。一種是提供簡(jiǎn)單的個(gè)性化定制,比如iPad mini訂購(gòu)時(shí)背面的刻字,比如購(gòu)買(mǎi)手機(jī)時(shí)外殼的顏色和樣式等,另一種則是像 Nike、Sony這種提供對(duì)某個(gè)系列的產(chǎn)品的各個(gè)部分的定制。這兩種定制化方式都存在著明顯的不足,第一種方式可以給用戶帶來(lái)一定的個(gè)性化元素,但僅僅是外觀上的部分改變,而且變化非常有限。第二種方式雖然可以提供幾乎完全的產(chǎn)品定制,但定制方式幾乎一成不變,不夠靈活。例如
Nike官網(wǎng)提供的Nikeid專屬定制服務(wù),用戶可以選擇鞋面、鞋底的樣式及顏色,但可以進(jìn)行定制的部分是由廠商決定的,如果用戶的需求發(fā)生了改變,例如需要增加對(duì)鞋面標(biāo)志的定制,或者增加鞋面可選的樣式,滿足需求的代價(jià)就有可能是修改整個(gè)系統(tǒng)。
所以說(shuō)現(xiàn)有的定制化模式缺少可拓展性。
用戶的需求可能是經(jīng)常變化的,市場(chǎng)需要的是一種更為靈活多變的定制化解決方案,定制的內(nèi)容可以隨用戶需求的變化增加或減少,這就需要應(yīng)用到裝飾者模式,通過(guò)動(dòng)態(tài)的增加或減少某個(gè)對(duì)象的職責(zé)實(shí)現(xiàn)靈活的產(chǎn)品定制化服務(wù)。
2.2 應(yīng)用示例
假設(shè)某筆記本商需要向顧客提供定制服務(wù),需要一套自動(dòng)化的定制系統(tǒng)。筆記本有5個(gè)部分可以進(jìn)行定制:Cpu、內(nèi)存、外殼、硬盤(pán)、顯卡。
2.2.1 用繼承的方式來(lái)實(shí)現(xiàn):
提出分析系統(tǒng)的需求后,可以設(shè)計(jì)出如下的類圖,如圖2所示:
圖2 應(yīng)用繼承的方式設(shè)計(jì)的定制系統(tǒng)的類圖
在圖2中,NoteBook類是所有筆記本的基類,所有種類的筆記本都是該類的子類。Part類是表示筆記本配件的抽象類。Cpu類,Ram類,Case類,Drive類,Graphics類都是其子類。
在基類里包含5個(gè)變量,組合了Cpu,Ram,Case,Drive,Graphics5個(gè)類的對(duì)象,每個(gè)變量有相應(yīng)的Setter()方法可以設(shè)置其值。
雖然這看起來(lái)是個(gè)不錯(cuò)的設(shè)計(jì)方式,但是再?gòu)膽?yīng)對(duì)變化的角度來(lái)推敲這個(gè)設(shè)計(jì),對(duì)一個(gè)筆記本定制系統(tǒng)來(lái)說(shuō),最頻繁的變化就是配件可選配置的變化。例如,原先只允許定制筆記本外殼的整體顏色,現(xiàn)在需要對(duì)筆記本A面,B面,以及側(cè)邊的樣式都進(jìn)行定制,這樣就要修改Case類的代碼,為其添加屬性和方法;或者需要增加對(duì)筆記本鍵盤(pán)的定制,我們就只能修改基類NoteBook類的代碼,增加一個(gè)Keyboard屬性。這種從代碼的層次來(lái)應(yīng)對(duì)變化的方式無(wú)疑是很糟糕的。完全不符合“對(duì)擴(kuò)展開(kāi)發(fā),對(duì)修改關(guān)閉”設(shè)計(jì)原則。
在分析了用繼承的缺點(diǎn)之后,可以看出現(xiàn)在需要一種支持在可定制配件總類發(fā)生變化或配件可選配置發(fā)生變化而不需要修改已有代碼的設(shè)計(jì)。于是,我們需要用到裝飾者模式。
2.2.2 應(yīng)用裝飾者模式
可以把定制的過(guò)程想象成一個(gè)筆記本組裝的過(guò)程,每用一個(gè)裝飾者來(lái)裝飾筆記本對(duì)象就相當(dāng)于為筆記本添加一個(gè)配件。簡(jiǎn)單的類圖如圖3所示:
圖3 應(yīng)用裝飾者模式設(shè)計(jì)的定制系統(tǒng)的類圖
Notebook類是一個(gè)筆記本抽象類,代表裝飾者模式中的抽象組件(Component),Note1、Note2、是筆記本的兩個(gè)系列,每個(gè)系列都是Notebook類的一個(gè)子類(實(shí)際可能有很多個(gè)系列),代表具體組件(ConcreteComponent)。Decorator類也是Notebook類的一個(gè)子類,是一個(gè)抽象類,代表抽象裝飾者(Decorator)。Cpu、Ram、Case、Drive、Graphics,是Decorator類的非抽象子類,代表具體裝飾(ConcreteDecorator),即裝飾者。
假設(shè)每個(gè)部分都有兩個(gè)可選配置:
Cpu:Intel 酷睿i5 4200U、Intel 酷睿i7 4500U。
內(nèi)存:4GB DDR3 1600 MHz、8GB DDR3 1600 MHz。
外殼:銀白色、紅黑色。
硬盤(pán):500GB 5400轉(zhuǎn)、1TB 7200轉(zhuǎn)。
顯卡:NVIDIA GeForce GT 710M、NVIDIA GeForce GT 720M 。因此,每個(gè)部分不只用一個(gè)裝飾者,每種配置應(yīng)對(duì)應(yīng)一個(gè)裝飾者。更詳細(xì)的類圖如圖4所示:
圖4 應(yīng)用裝飾者模式設(shè)計(jì)的定制系統(tǒng)的改進(jìn)后的類圖
在NoteBook類用兩個(gè)抽象方法簡(jiǎn)單的表示筆記本的定制過(guò)程:
public abstract class NoteBook
{
public abstract double price();
public abstract void addComponent();//向筆記本添加配件的方法
}
CpuDec1類與Ramdec1類的部分代碼(其他裝飾者的代碼類似):
public class CpuDec1 extends Decorator{
private double price=1000;//cpu價(jià)格
public CpuDec1(NoteBook notebook) {
super(notebook);
}
public double price() {
return price+notebook.price();
}
public void addCpu1() {
System.out.print("裝上cpu1,");
KKKKK.; //為筆記本加上CPU的方法
}
public void addComponent() {
addCpu(); //為筆記本加上CPU的方法
notebook.addComponent();
}
}
public class RamDec1 extends Decorator{
private double price=400;//內(nèi)存價(jià)格
public RamDec1(NoteBook notebook) {
super(notebook);
}
public double price() {
return price+notebook.price();
}
public void addRam1() {
System.out.print("裝上內(nèi)存1,");
KKKKK.;//為筆記本加上內(nèi)存的方法
}
public void addComponent() {
addRam1();//為筆記本加上內(nèi)存的方法
notebook.addComponent();
}
}
Note1類的部分代碼
private double price=1500; //表示未進(jìn)行組裝的筆記本的基本價(jià)格
public double price() {
return price;
}
public void addComponent() {
KKKK;.//表示組裝完成
}
調(diào)用如下代碼:
NoteBook note;
Note= new CpuDec1(new CaseDec1(new Note1()));//此時(shí)Note是只裝了外殼和Cpu的筆記本
note=new DriveDec1(new GraphicsDec1(new Ram-Dec1(new CpuDec1(new CaseDec1(new Note1())))));//這時(shí)候的note是擁有所有配件的筆記本
note.addComponent();//表示開(kāi)始組裝筆記本
System.out.println(note.price());//定制后的筆記本的價(jià)格
運(yùn)行的效果大致如圖5所示:
圖5 程序模擬運(yùn)行效果圖
這樣,如果需要增加外殼的定制樣式,我們不需要修改原Case類的代碼,只需增加一個(gè)裝飾者類。
通過(guò)以上兩種方式的對(duì)比,可以發(fā)現(xiàn),應(yīng)用裝飾者模式可以使整個(gè)系統(tǒng)更加靈活,更利于擴(kuò)展;定制化的靈活性越高,越能更好地滿足用戶的需求。但是,如果每個(gè)筆記本部件的可選配置有很多種,或者說(shuō)想要實(shí)現(xiàn)每個(gè)部件的精細(xì)化定制,就有可能需要用到很多個(gè)裝飾者類,而且裝飾鏈過(guò)長(zhǎng)會(huì)影響程序的效率。過(guò)度使用裝飾者會(huì)讓程序變得過(guò)于復(fù)雜,一味追求靈活性而使程序變得復(fù)雜也是不可取的,并不是每個(gè)變化都要用裝飾者模式來(lái)實(shí)現(xiàn),模式的使用要適當(dāng)。
電子商務(wù)的發(fā)展正在邁向定制化,現(xiàn)有的系統(tǒng)不足以滿足用戶需求。開(kāi)發(fā)者面臨的用戶群越來(lái)越龐大,要處理的變化越來(lái)越多,系統(tǒng)的功能越來(lái)越復(fù)雜。通過(guò)應(yīng)用設(shè)計(jì)模式可以保證軟件的良好結(jié)構(gòu),提高代碼的復(fù)用性,同時(shí)能使系統(tǒng)更易于維護(hù)與修改。
[1] 白東蕊,岳云康,張瑩.電子商務(wù)概論[M].北京:人民郵電出版社,2013.
[2] 為什么定制化才是電子商務(wù)的未來(lái),http://soft.chinabyte.com/498/12775498.shtml.
[3] 大規(guī)模定制化B2C成電子商務(wù)新趨勢(shì)[J] .IT經(jīng)理世界.2007年第22期 .
[4] 耿祥義,張躍平.java設(shè)計(jì)模式[M].北京:清華大學(xué)出版社,2013.
[5] 沙洛維(AlanShalloway) .設(shè)計(jì)模式解析[M].2版. 北京:人民郵電出版社, 2010.
[6] Erich Gamma.設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M]. 北京:機(jī)械工業(yè)出版社,2007.
The Application of Decorator Design Pattern into Electronic Commerce Customization Service
Fang Yajing, Rao Hao, Yu Weihong, Chen Yan
(Dalian Maritime University Transportation and Management School, Dalian116026, China)
With the development of electronic commerce, consumers are not satisfied with the product singleness any more. Needs for electronic commerce customization might be on the rise. It analyses problems existing in the implementation of customization of electronic commerce systems and proposes a method of applying the decorator design pattern into electronic commerce customization system designs. Through an example, the inheritance mechanism and the decorator design pattern are compared and the functions of the decorator design pattern for software scalability and maintainability are illustrated.
Decorator Design Pattern; Customization; Electronic Commerce; System Design
TP311
A
1007-757X(2014)10-0020-03
2014.05.27)
遼寧省精品資源共享課項(xiàng)目資助(363187)
方雅婧(1995-),女,大連海事大學(xué)電子商務(wù)專業(yè),管理學(xué)學(xué)士,研究方向:電子商務(wù),大連,116026饒 浩(1993-),男,大連海事大學(xué)電子商務(wù)專業(yè),管理學(xué)學(xué)士,研究方向:電子商務(wù),大連,116026于衛(wèi)紅(1972-),女,大連海事大學(xué)管理科學(xué)與工程學(xué)科,副教授,博士,研究方向:電子商務(wù)、多Agent理論與應(yīng)用、Android物聯(lián)網(wǎng),大連,116026陳 燕(1952-),女,大連海事大學(xué)管理科學(xué)與工程學(xué)科,教授,博士,研究方向:數(shù)據(jù)挖掘、交通大數(shù)據(jù),大連,116026