一种基于泛型的装饰模式实现方法

2018-01-01 00:18陈辉
科学与财富 2017年30期
关键词:设计模式模板

摘 要: 本文阐述了设计模式的定义及基本要素,分析了装饰模式的结构、动机与目的,对比基于继承与虚函数的实现,提出了一种基于泛型的实现方法及代码。最后讨论了该实现方法的优缺点。

关键词: 设计模式; 泛型; 静多态; 动多态; 装饰模式; 模板

1 引言

设计模式是对于某一类的软件设计问题的可重用的解决方案。[1]在软件开发中,其主要作用为:重用设计、共用词汇、方便交流、易于重构。一个模式有四个基本要素:1)模式名称,用于描述模式的问题、解决方案和效果;2)问题 用于解释设计问题和问题存在的前因后果;3)解决方案 描述设计的组成部分、相互关系及其各种的职责和协作方式;4)效果 描述模式应用的效果和使用模式应权衡的问题。[2]设计模式主要分为创建型、结构型、行为型,装饰模式是结构型模式之一,其意图是“动态地给一个对象添加一些额外的职能”。

在面向对象程序设计中,封装变化最主要的技术是多态。多态是同一实体同时具有多种形式,即同一操作作用于不同的对象,产生不同的执行结果。多态分为动多态、静多态。动多态是通过继承和虚函数来实现的,在运行期间,虚函数调用不同子类型的虚成员函数以实现不同的功能。静多态是通过泛型中模板实现的,在编译期间,接口绑定不同的功能代码。

当前,设计模式的实现技术是使用动多态,即继承与虚函数(接口与实现)。其主要的问题是,接口必须在公共基类中预先设定,动多态的绑定是入侵性的或者插入式的。针对这一问题,本文以装饰模式为例,使用静多态给出非入侵性或非插入式的实现。

2 装饰模式

装饰模式是对象的结构型模式,其动机是:给对象添加额外的功能,同时避免给类添加额外的功能。为了避免继承的子类获得其不需要的功能,可使用装饰模式。

装饰模式结构图如图1,[3]其参与者分别为:Component定义一个对象接口,可以给这些对象动态地添加职责;ConcreteComponent定义一个对象,可以给这个对象添加职责;Decorater维持一个指向Component的指针,并定义一个与Component接口一致的接口。ConcreteDecorator向组件添加职责。对象协作中,Decorator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。

3 泛型与模板

泛型是现代程序设计语言的一种特性。泛型是一种特殊的类型,其将指定类型的工作延迟到客户端代码声明并实例化类或方法的时候,泛型将类型参数化以达到代码复用的目的,从而提高软件开发工作效率。

不同的语言支持的泛型的特性不同。.NET泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作其所存储的对象的类型的占位符;类型参数作为其字段的类型及其方法的参数类型出现。泛型方法可以将其类型参数用作其返回值的类型或者其某个形参的类型。Java 泛型的参数只代表类,不能代表个别对象。由于 Java 泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型。Java?编译器在编译泛型时会自动加入类型转换的编码,因此其运行速度不会因为使用泛型而加快。[4] 在C++ 中,泛型即模板,其无法对泛型的类型参数进行约束,在编译时,每个使用的封闭泛型类型都有独立的编码产生,编译器确保其类型安全性。[5]C++模板有两种类型,函数模板与类模板。下面以C++模板为例,给出装饰模式的实现方法。

4 泛型实现装饰模式

基于泛型的静多态为实现设计模式提供了新方法。静多态的实现类型在编译期中确定,从而可以避免使用指针,其具备更好的类型安全性,更高的效率。下面是其实现结构图。

Class ConcreteDecoratorA {

Public:

Void operation() const;

Void AddedBehaviorA() const;

}

Class ConcreteDecoratorB{

Public:

Void operation() const;

Void AddedBehaviorB() const;

}

Template

Class RefinedComponent {

Private:

T const decorator;

Public:

Void Operation() ;

}

Template

Void RefinedComponent::Operation()

{

decorator.operation();

}

在基于泛型的装饰模式实现中,由于基类变成泛型,实现了非入侵性或非插入式的绑定。

同时,基于静多态的实现代码数量也减小。

5优点与缺点

基于泛型的装饰模式具有以下优点:1)无需通过公共基类来表达接口的共性,更便于实现内建类型的集合;2)不通过指针进行间接调用,生成的代码效率较高;3)对于提供部分接口的具体类型也可以调用;4)静多态在编译期对所有的绑定操作进行检查,具有更好的类型安全性。其缺点是:1)不能优雅地处理异类集合;2)实现代码虽小,但可执行生成代码较大;具体实现中,可根据其优缺点进行选择。

6 结束语

综上所述,装饰模式可通过继承与虚函数实现,也可通过泛型和模板实现。不同封装变化的技术可以实现相同的功能,本文给出了装饰模式基于泛型的实现方法及代码,其他模式也可通过泛型实现。

参考文献

[1] Gamma Erich.设计模式可复用面向对象软件的基础[M].北京:北京机械工业出版, 2000.

[2] 拉尔曼.UML 和模式应用:面向对象分析与设计导论[M].北京:北京机械工业出版社, 2001.

[3] Shalloway Alan.设计模式解析[M].北京:中国电力出版社, 2003.

[4] Wu T C.Java 面向对象程序设计[M].第 2 版.北京:清华大学出版社, 2002.

[5] (美)MatthewH.Austern著,侯捷译.泛型编程与STL[M]. 中国电力出版社, 2003

作者簡介:陈辉(1973-),男,汉族,湖北武汉人,浙江商业职业技术学院,讲师,研究方向为计算机网络和软件理论。

猜你喜欢
设计模式模板
铝模板在高层建筑施工中的应用
铝模板在高层建筑施工中的应用
“1+1”作业设计模式的实践探索
设计模式挖掘的有效性评估策略
三维协同设计模式下的航天项目管理实践与展望
巧用思维模板 强化规律应用
交通机电工程设计模式创新探讨
Estimation of irrigation requirements for drip-irrigated maize in a sub-humid climate
基于“双师制”指导下的工业设计专业毕业设计模式
铝模板在高层建筑施工中的应用