C++ 设计模式之模板方法模式

C++ 设计模式之模板方法模式

简介

1、模板方法模式(Template Method)是一种行为型设计模式,它在一个方法中定义一个算法的骨架,而让一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

2、模板方法模式 (Template Method)应用场景包括但不限于:

2.1、在算法框架固定,但具体步骤有所差异的情形下,如各种排序算法的框架。

2.2、当有许多共享相同的方法,但是有小部分需要各自实现的场合。

2.3、当需要控制子类扩展的点时。

3、模板方法模式 (Template Method)的构成

3.1、抽象类(Abstract Class):定义了一个或多个抽象操作,以及一个或多个非抽象的操作(即模板方法)。这些非抽象操作通常会调用抽象操作。

c 复制代码
class Game
{
public:
	void play();

protected:
	virtual void initialize() = 0;
	virtual void startPlay() = 0;
	virtual void endPlay() = 0;
};

3.2、具体子类(Concrete Subclass):实现抽象类中的抽象操作,从而提供了抽象操作的具体实现。

c 复制代码
class Chess : public Game
{
protected:
	void initialize();
	void startPlay();
	void endPlay();
};

4、模板方法模式 (Template Method)的优点

4.1、代码复用:通过将不变部分的代码移至父类,子类只需要实现变化的部分,这提高了代码复用。

4.2、扩展性好:新增具体类时,不需要改变抽象类和其他具体类的代码,保证了代码的可维护性和扩展性。

4.3、引入模板方法可以使子类的实现更加清晰,可维护性也更好。

4.4、实现了反向控制(依赖倒置),高层模块对低层模块的控制。

5、模板方法模式 (Template Method)的缺点

5.1、每一个不同的实现都需要一个子类来实现,这可能会导致系统中类的数目增加,增加了系统的复杂性。

5.2、父类中的抽象方法由子类实现,子类的执行结果会影响到父类的结果,也就是父类部分对子类产生的依赖性。

简单示例

1、定义

c 复制代码
class Game
{
public:
	void play();

protected:
	virtual void initialize() = 0;
	virtual void startPlay() = 0;
	virtual void endPlay() = 0;
};

class Chess : public Game
{
protected:
	void initialize();
	void startPlay();
	void endPlay();
};

class Monopoly : public Game
{
protected:
	void initialize();
	void startPlay();
	void endPlay();
};

2、实现

c 复制代码
void Game::play()
{
	initialize();
	startPlay();
	endPlay();
}

void Chess::initialize()
{
	std::cout << "Chess Game Initialized!" << std::endl;
}

void Chess::startPlay()
{
	std::cout << "Chess Game Started. Enjoy the game!" << std::endl;
}

void Chess::endPlay()
{
	std::cout << "Chess Game Finished!" << std::endl;
}

void Monopoly::initialize()
{
	std::cout << "Monopoly Game Initialized!" << std::endl;
}

void Monopoly::startPlay()
{
	std::cout << "Monopoly Game Started. Enjoy the game!" << std::endl;
}

void Monopoly::endPlay()
{
	std::cout << "Monopoly Game Finished!" << std::endl;
}

3、调用

c 复制代码
Game* game = new Chess();
game->play();
delete game;
std::cout << std::endl;
game = new Monopoly();
game->play();
delete game;
相关推荐
jimy16 小时前
基类没有虚析构函数,基类指针删除派生类对象,行为是未定义的
开发语言·c++
xlq223227 小时前
全面复习2
c++
无名猿7 小时前
移动构造与移动赋值:把资源偷过来
c++·性能优化·内存管理·现代c++·语法基础
All for pursuit.8 小时前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
白杨尚青8 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
染指11108 小时前
135.Agent-多Agent框架-LangChain多智能体(SubAgents子代理)
数据库·人工智能·设计模式·langchain·agent·agents
(Charon)9 小时前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
无名猿9 小时前
成员初始化列表与初始化顺序陷阱:按声明顺序,不是书写顺序
c++·现代c++·语法基础
91刘仁德9 小时前
传输层协议深度拆解:端口寻址、UDP 报文与 TCP 可靠性机制全解析
linux·网络·c++·网络协议·tcp/ip·udp·c
Liuchang09119 小时前
洛谷 P2670 [NOIP 2015 普及组] 扫雷游戏
c++·算法·游戏