作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
模版模式
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
使用场景
- 有多个子类共有的方法,且逻辑相同。
- 重要的、复杂的方法,可以考虑作为模板方法。
优缺点
-
优点:
1、封装不变部分,扩展可变部分。
2、提取公共代码,便于维护。
3、行为由父类控制,子类实现。 -
缺点:
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
注意事项
为防止恶意操作,一般模板方法都加上 final 关键词。
UML结构图
代码实现
interface.h
创建抽象类 - 游戏;创建实体类 - 玩板球、玩足球
#include <iostream>
using namespace std;
class Game //基类-游戏
{
public:
Game() {}
virtual ~Game() {}
virtual void initialize() = 0;
virtual void startPlay() = 0;
virtual void endPlay() = 0;
virtual void play() final
{
initialize();
startPlay();
endPlay();
}
};
class Cricket: public Game //子类-玩板球
{
public:
void initialize()
{
cout << "Cricket Game Initialized! Start playing!" << endl;
}
void startPlay()
{
cout << "Cricket Game Started. Enjoy the game!" << endl;
}
void endPlay()
{
cout << "Cricket Game Finished!" << endl;
}
};
class Football: public Game //子类-玩足球
{
public:
void initialize()
{
cout << "Football Game Initialized! Start playing!" << endl;
}
void startPlay()
{
cout << "Football Game Started. Enjoy the game!" << endl;
}
void endPlay()
{
cout << "Football Game Finished!" << endl;
}
};
main.cpp
实例应用 - 使用 Game 的模板方法 play() 来演示游戏的定义方式
#include "interface.h"
int main()
{
Game *game = new Cricket();
game->play();
cout << endl;
game = new Football();
game->play();
return 0;
}
运行结果:
Cricket Game Initialized! Start playing!
Cricket Game Started. Enjoy the game!
Cricket Game Finished!
Football Game Initialized! Start playing!
Football Game Started. Enjoy the game!
Football Game Finished!