设计模式笔记-Template模式
2016-05-30 16:30
489 查看
模板模式,逻辑很清晰,容易实现,用的也多!需求情景就是:对一个业务逻辑/算法实现,在不同对象中有不同的细节实现,但是逻辑的框架是相同的!就是说它们的操作步骤/接口是相同的,以继承的方式实现!看下图UML就明白了:到公司应聘,公司给每人发一个简历表,让大家填,而不是直接用每个人自己带的简历!
有几点:
1. 将逻辑框架放在抽象基类中,并定义好细节的接口,子类中实现细节! 这和Strategy模式不同,后者是将逻辑封装到一个类中,采取组合的方式解决这个问题!见后一篇!
2. 上图中FillResume()函数里实现的就是逻辑的框架,其中肯定调用了三个SetXxx函数!
3. 三个SetXxx()函数都是protect成员, 经public继承后都只提供给模板方法调用,单独对外开放没实际意义!
上面这种设计原则被称为依赖倒置(DIP, Dependency Inversion Principles):父类调用子类的操作,子类接口实现父类声明的接口!控制权在父类,子类反而要依赖高层模块!
模板模式的缺点:假设有另一个Resume抽象基类的变体AnotherResume,它们通用算法不一样,但SetXxx实现有些是一样的,想复用Resume子类的具体算法实现就不可能了,因为人家细节实现是靠继承完成的,它没有继承Resume。 这个问题,也可以通过Strategy模式的组合方式解决!
有几点:
1. 将逻辑框架放在抽象基类中,并定义好细节的接口,子类中实现细节! 这和Strategy模式不同,后者是将逻辑封装到一个类中,采取组合的方式解决这个问题!见后一篇!
2. 上图中FillResume()函数里实现的就是逻辑的框架,其中肯定调用了三个SetXxx函数!
3. 三个SetXxx()函数都是protect成员, 经public继承后都只提供给模板方法调用,单独对外开放没实际意义!
上面这种设计原则被称为依赖倒置(DIP, Dependency Inversion Principles):父类调用子类的操作,子类接口实现父类声明的接口!控制权在父类,子类反而要依赖高层模块!
模板模式的缺点:假设有另一个Resume抽象基类的变体AnotherResume,它们通用算法不一样,但SetXxx实现有些是一样的,想复用Resume子类的具体算法实现就不可能了,因为人家细节实现是靠继承完成的,它没有继承Resume。 这个问题,也可以通过Strategy模式的组合方式解决!
//简历 class Resume { protected: //保护成员 virtual void SetPersonalInfo() {} virtual void SetEducation() {} virtual void SetWorkExp() {} public: void FillResume() { SetPersonalInfo(); SetEducation(); SetWorkExp(); } }; class ResumeA: public Resume { protected: void SetPersonalInfo() { cout<<"A's PersonalInfo"<<endl; } void SetEducation() { cout<<"A's Education"<<endl; } void SetWorkExp() { cout<<"A's Work Experience"<<endl; } }; class ResumeB: public Resume { protected: void SetPersonalInfo() { cout<<"B's PersonalInfo"<<endl; } void SetEducation() { cout<<"B's Education"<<endl; } void SetWorkExp() { cout<<"B's Work Experience"<<endl; } };
int main() { Resume *r1; r1 = new ResumeA(); r1->FillResume(); delete r1; r1 = new ResumeB(); r1->FillResume(); delete r1; r1 = NULL; return 0; }
相关文章推荐
- Ubuntu 14.04 FTP服务器--vsftpd的安装和配置
- 使用jQuery判断浏览器滚动条位置的方法
- ORA-00845 Raised When Starting Instance (文档 ID465048.1)
- SpringMVC学习系列(1) 之 初识SpringMVC
- android studio SQLite管理备忘
- php+mongodb开发环境搭建(linux+apache+mongodb+php)
- Xcode 快捷键-b
- Android EditText禁止复制粘贴
- redis之(十六)redis的cluster集群环境的搭建,转载
- Maven
- 模拟实现atoi(),字符串循环位移,8bit位指定位的置0或置1
- windows下使用Redis存储
- Android中事件焦点抢占问题
- 最大熵模型介绍及实现
- MPEG2
- Mysql的帮助命令
- Delphi自动适应屏幕分辨率的属性
- android 端缓存清理的实现
- Activity往另外一个Activity传值,Fragment获取另外一个Activity里面的值。
- Leetcode 之Binary Tree Postorder Traversal(47)