Template模式
2015-07-17 18:26
169 查看
在开发时,有时会遇到对于一个算法的实现,在不同的对象中有不同的实现,但是这个算法的框架是相同的,这时可以使用Template模式或Strategy模式。Template是采用继承的方式来实现这一点,即将算法框架放在抽象基类中,在基类定义好接口,之后在派生类实现算法。
类图结构如图所示:
//Template.cpp
//main.cpp
Template模式的关键是将算法抽象封装在基类中,并在不同的派生类中实现。Template模式获得了一个反向控制结构的效果,即依赖倒置原则。即在父类调用子类的操作(高层模块调用底层模块的操作),底层模块实现高层模块声明的接口。所以控制权在高层模块(父类),底层模块要依赖高层模块。
Template模式也有缺点,继承是一种强制约束关系。例如在ConcreteClass中实现的方法PrimitiveOperation不能被其他类复用。
类图结构如图所示:
//Template.h #ifndef _TEMPLATE_H_ #define _TEMPLATE_H_ class AbstractClass { public: virtual ~AbstractClass(); void TemplateMethod(); protected: virtual void PrimitiveOperation() = 0; }; class ConcreteClass1 :public AbstractClass { public: ConcreteClass1(); ~ConcreteClass1(); void PrimitiveOperation(); }; class ConcreteClass2 :public AbstractClass { public: ConcreteClass2(); ~ConcreteClass2(); void PrimitiveOperation(); }; #endif
//Template.cpp
//Template.cpp #include"Template.h" #include<iostream> using namespace::std; AbstractClass::~AbstractClass() {} void AbstractClass::TemplateMethod() { PrimitiveOperation(); } ConcreteClass1::ConcreteClass1() {} ConcreteClass1::~ConcreteClass1() {} void ConcreteClass1::PrimitiveOperation() { cout << "ConcreteClass1 PrimitiveOperation()" << endl; } ConcreteClass2::ConcreteClass2() {} ConcreteClass2::~ConcreteClass2() {} void ConcreteClass2::PrimitiveOperation() { cout << "ConcreteClass2 PrimitiveOperation()" << endl; }
//main.cpp
//main.cpp #include"Template.h" int main() { AbstractClass* p1 = new ConcreteClass1(); AbstractClass* p2 = new ConcreteClass2(); p1->TemplateMethod(); p2->TemplateMethod(); return 0; }
Template模式的关键是将算法抽象封装在基类中,并在不同的派生类中实现。Template模式获得了一个反向控制结构的效果,即依赖倒置原则。即在父类调用子类的操作(高层模块调用底层模块的操作),底层模块实现高层模块声明的接口。所以控制权在高层模块(父类),底层模块要依赖高层模块。
Template模式也有缺点,继承是一种强制约束关系。例如在ConcreteClass中实现的方法PrimitiveOperation不能被其他类复用。
相关文章推荐
- iOS 实现类似微博或者陌陌上的显示附近位置信息功能。
- 基于android 实现截取 内容超过屏幕大小的长图
- ios 串
- 基于display:table的CSS布局让HTML元素和像table一样
- 十个免费的 Web 压力测试工具
- ASP.NET - 在线编辑器(FreeTextBox)
- Delete Node in a Linked List
- Codeforces 321A Ciel and Robot 枚举答案
- php形式的内容被处理
- IOS - 用户信息界面
- invalidate和postInvalidate 的区别及使用
- Android USB Host 与 HID 之通讯方法
- 【LeetCode】Python requests模拟Leetcode登陆
- 屏幕适配
- (简单) POJ 3368 Frequent values,RMQ。
- mysql大表设计
- 超级全的Java开发中的23种设计模式详解
- 高并发高可用的 架构实践
- jvm性能调优(转载)
- (FFOS Gecko) - useful MACRO