设计模式的研究与应用
赵学军 林捷 李霞 李刚 贺向阳 宁书年
(中国矿业大学 北京 100083)
摘要:设计模式是面向对象的软件设计与实现的关键技术。较好地理解设计模式以及建立良
好的设计模式是应用设计模式的前提。本文重点介绍了建立良好的设计模式应满足的一般原
则,同时结合具体的设计模式讲述了这些原则的具体应用。
关键词:面向对象 设计模式 软件复用
The Research And Application Of Design Pattern
Zhao xuejun,Lin jie,Li xia,Li gang,He Xiang yang,Ning shunian
(China University of Mining and Technology BeiJing 100083)
Abstract: Design Pattern is the key technology in object-oriented software designing
and implementation. To understand it well and construct good Design Pattern is the
foundation to deploy it. The article mainly introduces some basic rules which Design
Pattern complies with, meanwhile, describes how to deploy this rules into detailed
application using the specific Design Pattern.
Key words: Object-Oriented Design Pattern Software reuse
从 60 年代末开始, 由于计算机软件对生产力有巨大的推动作用,各种大型、复杂的软件
系统相继被开发出来。然而, 随着软件系统规模的扩大和复杂性的增加, 软件开发需要越来
越巨大的人力、物力,同时软件系统的可靠性和可维护性明显降低 ,软件业出现了危机。直
到 80 年代,软件开发采用面向对象的开发语言,软件危机才在一定程度上得到缓解。面向对
象开发方法的核心思想是将系统看成是对象及对象之间的相互关系的集合,思维方式更接近
人们认识世界的规律,克服了面向过程开发存在的诸多弊端。但是采用面向对象的方法来开
发软件,也需要一些正确的开发原则来指导,否则,开发的软件将不可避免的带有某些缺陷,
如系统过于僵硬,不能很好的适应需求变化;系统过于脆弱,往往修改一处代码会带来无法
预测的后果;系统复用率低,黏度过高等。为了避免上述缺陷,设计具备良好的可扩展性、
可复用性、易维护性的系统,在系统设计和实践阶段我们应采用设计模式的思想。
1、 设计模式概述
在计算机科学中,对设计模式的简单定义就是对于一类重复出现的问题的一种可重用的
解决方案 ,在软件工程中一个设计模式往往能解决一类软件设计问题。设计模式的使用帮助
设计人员更加简单、方便地改进或复用以往成功的设计和体系结构,采用设计模式的软件系
统具有更好的可维护性。一般而言,一个模式有四个基本要素:
1. 模式名称(pattern name):一个助记名,它用一两个词来描述模式的问题、解决方
案和效果。
2. 问题(problem):描述了应该在何时使用模式。
3. 解决方案(solution):描述了设计的组成成分,它们之间的相互关系及各自的职责和
协作方式。
4. 效果(consequences):描述了模式应用的效果及使用模式应权衡的问题。
2、 设计模式的分类
设计模式依据其目的可分为创建型( C r e a t i o n a l )、结构型( S t r u c t
u r a l )、或行为型( B e h a v i o r a l )三种。创建型模式与对象的创建有关;结构
型模式处理类或对象的组合;行为型模式对类或对象怎样交互和怎样分配职责进行描述。
由于设计模式的抽象性较高,一般较难准确的全面理解与把握。从设计模式普遍遵循的
原则角度出发来研究设计模式,可以使我们能够更加深入的理解设计模式,从而更好的掌握
它。
3、设计模式的基本原则:
“开放与关闭”原则(Open-Closed Principle)
此原则指的是软件组成实体应当是可以扩展的,但是不可修改。这一原则最早在
Bertrand Meyer【MEYER88】提出。
满足此原则的的软件系统会有以下的优点:
①通过扩展已有的系统,可以提供新的功能。
②已有的软件模块的抽象层模块不能修改,这又提供了系统的稳定性和连续性。要作到
开闭原则,最重要的是抽象化。
面向抽象编程原则(Program to an interface,not a implementation):
此原则指的是:要依赖抽象,不要依赖具体,即针对接口编程,不要针对实现编程。
满足此原则的软件系统会有以下的优点:
① 整个软件系统是在抽象层上进行复用,能够给系统带来极大的灵活性,对应将来的
需求变化,系统能够较好的适应。
② 具体层可以根据不同的情况有不同的实现,系统拥有良好的扩充性。
基于组合或聚合(关联关系)来进行复用,而不是通过使用继承关系的原则(Favor
Composition Over Inheritance)。
组合和聚合都是关联关系的一种特例。关联关系是指对象类通过引用别的类的对象来实
现自己的行为。组合和聚合的区别在于是否对引入的对象进行生命期管理,聚合一般不涉及
到对引入对象的生命期管理,而组合则相反。这条原则指的是在系统中的对象中组合或聚合
别的对象来实现功能复用的目的。这里,并不是说一定要使用组合或聚合而不能使用继承而
是说优先使用组合或聚合。继承是面向对象语言的特性,它提供了一条功能复用的最直接的
方法,这是它的优点,同样它的缺点也是显而易见的,那就是当向基类中增删方法或属性时,
会影响到其所有的子类,而且子类对基类功能复用只是静态的,无法提供动态的功能复用。
在进入面向对象的编程世界时,大多数初学者都容易犯一个相同的错误――滥用继承,结果
是造成系统中大量的类的出现,大多数的继承关系使用不当,造成系统的可维护性极差,而
使用聚合或组合来完成相同的功能,可以具有以下优点:
① 能够提供动态的功能复用。
② 系统中类的数目明显减少,而且类之间的关系清晰明确,有利于提高系统的可读性、
灵活性、可维护性。
上述这些原则在软件系统中是一个整体,是相互作用的,不能够孤立地来看待这些原则。
4、设计模式原则的综合应用
下面以策略模式(Strategy)为例来介绍上述三条原则的综合应用。
中国科技论文在线
图一 策略模式
示例代码如下:
class Composition
{
public: Composition(Compositor *)
{Icompositor=Compositor;}//仅作为举例使用,
Traverse()
{ }//逻辑代码,
Repair()
{
Icompostitor->Compose();//使用组合对象 Icompostitor 来获得服务;
}
private :Compositor* Icompostitor;
}
class Compositor
{
public: Compositor();
virtual int Compose()=0;//对外抽象逻辑接口,这里不能实现
protected:Compositor();
}
class SimpleCompositor :public Compositor
{
Compose()
{……..}//具体算法实现
}
class TeXCompositor :public Compositor
{
Compose()
{………}//具体算法实现
}
class ArrayCompositor:public Compositor
中国科技论文在线
{
Compose()
{…….}//具体算法实现
}
客户端代码:(部分)
Composition*test1=new Composition(new SimpleCompositor());//这儿可以按照客
户的意愿替换 Composition 的构造函数的参数,从而得到不同的服务.
其中 Compositor 抽象类封装了算法 compose(),体现了对逻辑功能修改的关闭,而它的
子类如 SimpleCompsositor、TeXCompositor、ArrayCompositor 等具体实现了特定的
Compose()(算法),能够给系统提供相应的算法,体现了对功能扩展的开放。这样凡是
Compositor 的子类在客户端都可以互换使用,表现了良好的可互换性和可扩展性。另外,
凡是 Compositor 的子类也都实现了 Compose()方法,表现了系统逻辑功能的稳定性和延续
性。面向抽象的编程体现在算法 compose(),在 Compositor 抽象类中封装了抽象逻辑功能方
法 compose(),而在其子类中实现相应的功能,很显然,Composition 类正是使用了聚合的方
法来获得相应的 Compositor 的子类提供的逻辑服务的.
以上通过对典型的设计模式的分析,总结出面向对象设计中更为底层的一些原则,通过
研究各种设计模式,可以得出:设计模式是在实际的软件开发过程中综合运用了这些基本的
原则而产生的。可以说设计模式就是这些原则的直接的综合体现。在软件系统设计中,综合
应用这些原则及设计模式,那么系统就有可能得到良好的特性,如扩展性、维护性、健壮性、
灵活性等。
结束语:通过分析设计模式,抽象出了设计模式遵循的一般原则,这些原则有助于进一
步掌握设计模式的精髓,同时也为构建新的设计模式指明了方向。因此,在实践过程中应该
重视对这些原则的研究和应用。
参考文献:
[1] Erich Gamma, Richard Helm, Ralph Johnson, 等: Design Patterns: Elements of
Reusable Object-Oriented Software[M].Addison Wesley Publishing Company,1995.
[2] 李英军,等译.设计模式[M].北京:机械工业出版社,2000.
[3] Mark Grand. Patterns in java Wiley&Sons,Inc,1998
[4] James . Java Design Patterns:A Tutorial. Addison-Wesley,2000
[5] Alan Shalloway and James Patterns Explained-A New Perspective on
Object-Oriented Design. Addison-Wesley 2002
[6] 阎宏著,Java 与模式[M],北京:电子工业出版社 2002.
中国科技论文在线