文章目录
- 💡前言
- 分类
- 优点
- 💡问题引入
- 💡概念
- 💡例子
- 💡总结
💡前言
此文是第一篇讲解设计模式的文章,而笔者我又不想另起一篇来概述设计模式的分类,作用,以及优点,所以在此简单概述一下。
分类
根据GOF-23 模式分类
- 从目的来看:
- 创建型模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。(主要用于描述如何创建对象)
- 结构型模式:通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击。(主要用于描述如何实现类或对象的组合)
- 行为型模式:通过类继承或者对象组合来划分类与对象间的职责,从而应对需求变化为多个交互的对象带来的冲击。(主要用于描述类或对象怎么交互以及怎样分配职责)
- 从范围来看:
- 类模式处理类与子类的静态关系。
- 对象模式处理对象间的动态关系
还有一种分类角度:
优点
- 能够实现可维护性复用的设计方案,提高设计与开发效率
- 设计模式提供了一套通用的设计词汇和一种通用的形式来方便开发人员之间的沟通以及交流,使得设计方案更加通俗易懂。因为设计模式跨语言,跨平台,跨应用,跨国界
- 大部分设计模式都兼顾了系统的可重用性以及可扩展性,使得可以更好地重用一些已有的设计方案、功能模块以及一个完整的软件系统
- 合理使用设计模式并对设计模式的使用情况进行文档化,将有助于别人更快地理解系统
💡问题引入
在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。
如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?
💡概念
定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。
——《设计模式》GoF
简单点说就是,找出稳定(不变)的功能将其在父类中实现,而将一些 不稳定(变化)的放入子类 中实现。
💡例子
class Library
{
public:
void run()
{
// 模拟业务流程
step1();
step2();
step3();
step4();
step5();
}
~Library() {}
protected:
void step1() {} // 稳定
void step3() {} // 稳定
void step5() {} // 稳定
virtual void step2() {} // 变化
virtual void step4() {} // 变化
};
class Application : public Library
{
public:
void step2() {}
void step4() {}
};
int main()
{
Library* lib = new Application();
lib->run();
delete lib;
return 0;
}
上述的代码实例,就是子类来决定父类的执行;达到一种晚绑定。
💡总结
- 形式化算法:模板方法模式在父类中形式化地定义一个算法,而由子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序
- 代码复用:模板方法模式是一种代码复用技术,提取公共行为并放在父类中,通过子类实现不同的行为
- 实现反向控制:模板方法模式可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否执行
- 增加子类方便:模板方法模式中可通过子类覆盖父类的基本方法,不同子类可以提供基本方法的不同实现,更换以及增加新的子类很方便