模式:模板方法(Template)模式"/>
设计模式:模板方法(Template)模式
- 分类:行为型模式
- 特点:先定义一个操作中算法的骨架,而将某些步骤延迟到子类中实现。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定功能。
- 模式结构:
- UML图:略(后补)
- 抽象类(AbstractClass):定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤。主要是实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义在 AbstractClass 或其他对象中的操作。
- 具体类(ConcreteClass):实现原语操作以完成算法中与特定子类相关的步骤。
- 适用场景:
- 对一些复杂的算法进行分割,将算法中固定不变的部分设计为模板方法和父类具体方法,而一些可变的细节由子类实现。
- 各子类中公共的行为应被提取出来并集中到一个公共父类中,以避免代码重复。
- 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。
- 实例分析:
- 校园招聘: 校招时一般都会采用“宣讲会 -> 接收简历 -> 面试 -> 发放 Offer”这样一套固定流程。其中,各公司宣讲会(宣传企业文化、福利待遇)和接收简历(自带简历)的形式几乎是一样的,不同的是面试和发放 Offer 环节。阿里需要经过一面、二面、三面,并提供30W/年的薪酬;而腾讯则需要一面、二面,并提供25W/年的薪酬。
- 这里,公司是抽象类,“宣讲会 -> 接收简历 -> 面试 -> 发放 Offer”则是一套固定的模板方法(招聘流程)。具体类由阿里和腾讯表示,不同之处在于面试和发放 Offer 环节,需要它们分别实现。
- 1、创建抽象类:由 Company 表示,它提供了一套固定的模板方法 Recruit(),用于标准化算法的骨架
//abstract_class.h
#ifndef __ABSTRACT_CLASS_H__
#define __ABSTRACT_CLASS_H__#include<iostream>class Company
{
public:virtual ~Company() {}void Recruit(){CareerTalk();ReceiveResume();Interview();Offer();}//宣讲会void CareerTalk() { std::cout << "Opening CareerTlak." << std::endl; }//接收简历void ReceiveResume() { std::cout << "Receive Resume." << std::endl; }//面试virtual void Interview() = 0;//发放offervirtual void Offer() = 0;
};#endif //ABSTRACT_CLASS_H
- 2、创建具体类:创建阿里、腾旭公司,实现基类中的抽象方法
//concrete_class.h
#ifndef __CONCRETE_CLASS_H__
#define __CONCRETE_CLASS_H__#include "abstract_class.h"//阿里
class Alibaba : public Company
{
public://此处的virtual不写也可,因为父类virtual方法子类继承来后默认依旧是virtual方法//此处的override尽量写上(确认该方法是重写),注意override的位置virtual void Interview() override{std::cout << "First Intervie -> Second Interview -> Third InterView." << std::endl;}virtual void Offer() override{std::cout << "30W" << std::endl;}
};//腾讯
class Tencent : public Company
{
public:virtual void Interview() override{std::cout << "First Intervie->Second Interview" << std::endl;}virtual void Offer(){std::cout << "25W" << std::endl;}
};#endif //CONCRETE_CLASS
- 3、创建客户端
//mian.cpp
#include "concrete_class.h"#ifndef SAFE_DELETE
#define SAFE_DELETE(p) {if(p) {delete(p); (p) = NULL;}}
#endif // !SAFE_DELETEint main()
{//阿里招聘Company* alibaba = new Alibaba();alibaba->Recruit();//腾讯招聘Company* tencent = new Tencent();tencent->Recruit();SAFE_DELETE(alibaba);SAFE_DELETE(tencent);system("pause");return 0;
}
- 运行结果
更多推荐
设计模式:模板方法(Template)模式
发布评论