装饰者模式在定制化电子商务中的应用
2014-08-07方雅婧饶浩于卫红陈燕
方雅婧,饶浩,于卫红,陈燕
装饰者模式在定制化电子商务中的应用
方雅婧,饶浩,于卫红,陈燕
随着电子商务的发展,消费者开始不满足于单一不变的商品,定制化的电子商务逐渐兴起。分析了现有电子商务系统中定制化实现的不足,提出了将装饰者设计模式应用到电子商务定制化系统设计中的思路和方法。通过实例,比较了完全继承机制与装饰者模式的优劣,说明了装饰者模式在软件可扩展性和可维护性中的作用。
装饰者模式;定制化;电子商务;系统设计
0 引言
20世纪90年代,基于万维网的互联网技术突飞猛进,进而使得商务活动电子化的想法逐步成熟,而后互联网开始真正应用于商业交易,电子商务也日益蓬勃发展起来[1]。
随着竞争的激烈、销售的微利、消费的疲态,传统电商正面临着转型的压力。现在的消费者,在对便捷快速的网购习以为常之后,开始追求能凸显自我的个性化。互联网本身的互动性使人们可以按照需要进行选择而且具有数量庞大的潜在用户基础。于是,定制化电子商务的优点逐渐体现出来。定制化是C2B电商的一种体现,实际上是对传统B2C购物体验的进一步互动深挖。传统的B2C模式中所有环节都由厂商驱动,而C2B是由消费者驱动,以消费者需求为起点,力求发掘消费者的主动性与积极性的一种商业模式。毋庸置疑,定制化挖掘了互联网的真正潜力,是未来电子商务的发展方向[2][3]。
如何实现定制化、个性化是一个难题。个性化意味着消费者的选择不再是唯一的商品,而是不断变化的商品。相应的软件系统要面临着不断增加的变化,这就要求我们设计的系统拥有良好的可靠性,可复用性,可拓展性和可维护性。如果不进行设计优化,整个系统务必会缺少应对变化的能力,而设计模式可以使软件更易修改和维护。根据定制化的特点(动态地添加产品特性,而且可以随时撤销),装饰者模式可以更好帮助我们实现产品定制。
1 装饰者模式简介
设计模式是针对某一类问题的最佳解决方案,而且已经被成功应用于许多系统的设计中,它解决了在某种特定情景中重复发生的某个问题[4]。20 世纪90 年代初,Gamma、Helm、Johnson 和Vlissides 等人将建筑领域的模式思想引入到软件开发中,提出了注明的GOF23种设计模式,装饰者模式即属于其中之一[5]。
装饰者模式可以动态地给一个对象增加职责。就扩展对象功能来说,装饰者模式比生成子类更为灵活。
装饰者模式适用于以下3种情况:
(1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
(2)处理那些可以撤销的职责。
(3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类[6]。
装饰者模式的类图,如图1所示:
图1 装饰者模式的类图
·Component:定义一个对象接口,可以给这些对象动态地添加职责。
·ConcreteComponent:定义一个对象,可以给这个对象添加一些职责。
·Decorator:维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
·ConcreteDecorator:向组件添加职责。
Decorator模式的工作原理:
可以创建始于Decorator对象(负责新功能的对象)终于原对象的一个对象“链”。
每条链都始于一个Component对象。每个Decorator对象后面都跟着另一个Decorator对象或原ConcreteComponent对象。对象链总是终于一个ConcreteComponent对象。例如在图1中,ConcreteDecoratorB对象执行其operation方法,然后调用Decorator类的Operation方法。这又将调用ConcreteDecoratorB对象之后的Component对象的Operation方法。[5]
2 装饰者模式在电子商务定制化系统设计中的应用
2.1 问题的提出
现在流行的定制化方式可分为两种。一种是提供简单的个性化定制,比如iPad mini订购时背面的刻字,比如购买手机时外壳的颜色和样式等,另一种则是像 Nike、Sony这种提供对某个系列的产品的各个部分的定制。这两种定制化方式都存在着明显的不足,第一种方式可以给用户带来一定的个性化元素,但仅仅是外观上的部分改变,而且变化非常有限。第二种方式虽然可以提供几乎完全的产品定制,但定制方式几乎一成不变,不够灵活。例如
Nike官网提供的Nikeid专属定制服务,用户可以选择鞋面、鞋底的样式及颜色,但可以进行定制的部分是由厂商决定的,如果用户的需求发生了改变,例如需要增加对鞋面标志的定制,或者增加鞋面可选的样式,满足需求的代价就有可能是修改整个系统。
所以说现有的定制化模式缺少可拓展性。
用户的需求可能是经常变化的,市场需要的是一种更为灵活多变的定制化解决方案,定制的内容可以随用户需求的变化增加或减少,这就需要应用到装饰者模式,通过动态的增加或减少某个对象的职责实现灵活的产品定制化服务。
2.2 应用示例
假设某笔记本商需要向顾客提供定制服务,需要一套自动化的定制系统。笔记本有5个部分可以进行定制:Cpu、内存、外壳、硬盘、显卡。
2.2.1 用继承的方式来实现:
提出分析系统的需求后,可以设计出如下的类图,如图2所示:
图2 应用继承的方式设计的定制系统的类图
在图2中,NoteBook类是所有笔记本的基类,所有种类的笔记本都是该类的子类。Part类是表示笔记本配件的抽象类。Cpu类,Ram类,Case类,Drive类,Graphics类都是其子类。
在基类里包含5个变量,组合了Cpu,Ram,Case,Drive,Graphics5个类的对象,每个变量有相应的Setter()方法可以设置其值。
虽然这看起来是个不错的设计方式,但是再从应对变化的角度来推敲这个设计,对一个笔记本定制系统来说,最频繁的变化就是配件可选配置的变化。例如,原先只允许定制笔记本外壳的整体颜色,现在需要对笔记本A面,B面,以及侧边的样式都进行定制,这样就要修改Case类的代码,为其添加属性和方法;或者需要增加对笔记本键盘的定制,我们就只能修改基类NoteBook类的代码,增加一个Keyboard属性。这种从代码的层次来应对变化的方式无疑是很糟糕的。完全不符合“对扩展开发,对修改关闭”设计原则。
在分析了用继承的缺点之后,可以看出现在需要一种支持在可定制配件总类发生变化或配件可选配置发生变化而不需要修改已有代码的设计。于是,我们需要用到装饰者模式。
2.2.2 应用装饰者模式
可以把定制的过程想象成一个笔记本组装的过程,每用一个装饰者来装饰笔记本对象就相当于为笔记本添加一个配件。简单的类图如图3所示:
图3 应用装饰者模式设计的定制系统的类图
Notebook类是一个笔记本抽象类,代表装饰者模式中的抽象组件(Component),Note1、Note2、是笔记本的两个系列,每个系列都是Notebook类的一个子类(实际可能有很多个系列),代表具体组件(ConcreteComponent)。Decorator类也是Notebook类的一个子类,是一个抽象类,代表抽象装饰者(Decorator)。Cpu、Ram、Case、Drive、Graphics,是Decorator类的非抽象子类,代表具体装饰(ConcreteDecorator),即装饰者。
假设每个部分都有两个可选配置:
Cpu:Intel 酷睿i5 4200U、Intel 酷睿i7 4500U。
内存:4GB DDR3 1600 MHz、8GB DDR3 1600 MHz。
外壳:银白色、红黑色。
硬盘:500GB 5400转、1TB 7200转。
显卡:NVIDIA GeForce GT 710M、NVIDIA GeForce GT 720M 。因此,每个部分不只用一个装饰者,每种配置应对应一个装饰者。更详细的类图如图4所示:
图4 应用装饰者模式设计的定制系统的改进后的类图
在NoteBook类用两个抽象方法简单的表示笔记本的定制过程:
public abstract class NoteBook
{
public abstract double price();
public abstract void addComponent();//向笔记本添加配件的方法
}
CpuDec1类与Ramdec1类的部分代码(其他装饰者的代码类似):
public class CpuDec1 extends Decorator{
private double price=1000;//cpu价格
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;//内存价格
public RamDec1(NoteBook notebook) {
super(notebook);
}
public double price() {
return price+notebook.price();
}
public void addRam1() {
System.out.print("装上内存1,");
KKKKK.;//为笔记本加上内存的方法
}
public void addComponent() {
addRam1();//为笔记本加上内存的方法
notebook.addComponent();
}
}
Note1类的部分代码
private double price=1500; //表示未进行组装的笔记本的基本价格
public double price() {
return price;
}
public void addComponent() {
KKKK;.//表示组装完成
}
调用如下代码:
NoteBook note;
Note= new CpuDec1(new CaseDec1(new Note1()));//此时Note是只装了外壳和Cpu的笔记本
note=new DriveDec1(new GraphicsDec1(new Ram-Dec1(new CpuDec1(new CaseDec1(new Note1())))));//这时候的note是拥有所有配件的笔记本
note.addComponent();//表示开始组装笔记本
System.out.println(note.price());//定制后的笔记本的价格
运行的效果大致如图5所示:
图5 程序模拟运行效果图
这样,如果需要增加外壳的定制样式,我们不需要修改原Case类的代码,只需增加一个装饰者类。
通过以上两种方式的对比,可以发现,应用装饰者模式可以使整个系统更加灵活,更利于扩展;定制化的灵活性越高,越能更好地满足用户的需求。但是,如果每个笔记本部件的可选配置有很多种,或者说想要实现每个部件的精细化定制,就有可能需要用到很多个装饰者类,而且装饰链过长会影响程序的效率。过度使用装饰者会让程序变得过于复杂,一味追求灵活性而使程序变得复杂也是不可取的,并不是每个变化都要用装饰者模式来实现,模式的使用要适当。
3 总结
电子商务的发展正在迈向定制化,现有的系统不足以满足用户需求。开发者面临的用户群越来越庞大,要处理的变化越来越多,系统的功能越来越复杂。通过应用设计模式可以保证软件的良好结构,提高代码的复用性,同时能使系统更易于维护与修改。
[1] 白东蕊,岳云康,张莹.电子商务概论[M].北京:人民邮电出版社,2013.
[2] 为什么定制化才是电子商务的未来,http://soft.chinabyte.com/498/12775498.shtml.
[3] 大规模定制化B2C成电子商务新趋势[J] .IT经理世界.2007年第22期 .
[4] 耿祥义,张跃平.java设计模式[M].北京:清华大学出版社,2013.
[5] 沙洛维(AlanShalloway) .设计模式解析[M].2版. 北京:人民邮电出版社, 2010.
[6] Erich Gamma.设计模式:可复用面向对象软件的基础[M]. 北京:机械工业出版社,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)
辽宁省精品资源共享课项目资助(363187)
方雅婧(1995-),女,大连海事大学电子商务专业,管理学学士,研究方向:电子商务,大连,116026饶 浩(1993-),男,大连海事大学电子商务专业,管理学学士,研究方向:电子商务,大连,116026于卫红(1972-),女,大连海事大学管理科学与工程学科,副教授,博士,研究方向:电子商务、多Agent理论与应用、Android物联网,大连,116026陈 燕(1952-),女,大连海事大学管理科学与工程学科,教授,博士,研究方向:数据挖掘、交通大数据,大连,116026