策略模式和模版方法模式非常相似
实现代码
#include<vector>
#include<string>
#include<map>
#include<iostream>
#include <sstream>
using namespace std;
struct GameState { //状态
int current_player, winning_player;
int number_of_player;
};
template<typename FnStartAction, //函数式模板方法,根据传入函数实现操作
typename FnTakeTurnAction, //只要不同函数传入参数相同即可实现和策略模式相同的效果
typename FnHaveWinnerAction>
void rungame(GameState initial_state, FnStartAction start_action, FnTakeTurnAction take_trun_action, FnHaveWinnerAction have_winner) {
GameState state = initial_state;
start_action(state);
while (!have_winner(state)) {
take_trun_action(state);
}
cout << "Player " << state.winning_player<< "wins.\n";
}
int main()
{
int turn = 0, max_turn = 10;
GameState state{ 0,-1,2 };
auto start = [](GameState& s) { //将lambda函数作为函数参数导入
cout << "start" << s.number_of_player << " players" << endl;
};
auto take = [&](GameState& s) {
cout << "Turn " << turn++ << " taken by player " << s.current_player << endl;
s.current_player = (s.current_player + 1) % s.number_of_player;
s.winning_player = s.current_player;
};
auto have_winner = [&](GameState& s) {
return turn == max_turn;
};
rungame(state, start, take, have_winner);
}
该代码实现了模拟比赛的情况,其中start、take_turn、end函数都作为模板函数传入,根据传入函数(也就是选择的策略)会有不同的情况。
总结
策略模式中使用组合,可以静态、动态两种方式,但模板方法模式使用继承所以只能使用静态,因为实例化对象后就不能修改继承而来的特性了。
通过代码我们可以观察到策略模式和模板方法模式可以实现非常相似的效果。