三国后期,蜀国属于弱势一方,现丞相需要派出一位大将前去攻城,再有一位大将守城!丞相有妙计2条,阵型2个。那么派何人守城?何人去攻城?他们各使用何计?各使用何阵型?
在这个需求中,丞相的策略和所制定的阵型是可以随时变化的,而且不仅仅只有2条计策、2个阵型,所以我们需要单独的将计策和阵型独立出来,形成单独的算法族。以后出征前丞相有新的锦囊妙计也不会影响出征时的武将选择。这样无论派出何人去攻城都可以,派何人守城也是可以的。只需要按照不同的需求去领取不同的妙计和阵型即可。
策略模式——定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
代码实现
class JiMou{
public:
JiMou(){}
~JiMou(){}
virtual void ShiXing() = 0;
};
class FanJianJi:public JiMou{
public:
FanJianJi(){}
~FanJianJi(){}
void ShiXing(){
qDebug() << QStringLiteral("用反间计!");
}
};
class KongChengJi:public JiMou{
public:
KongChengJi(){}
~KongChengJi(){}
void ShiXing(){
qDebug() << QStringLiteral("用空城计!");
}
};
class BuZhen{
public:
BuZhen(){}
~BuZhen(){}
virtual void ZhiXing() = 0;
};
class ChangSheZhen:public BuZhen{
public:
ChangSheZhen(){}
~ChangSheZhen(){}
void ZhiXing(){
qDebug() << QStringLiteral("布长蛇阵!");
}
};
class BaGuaZhen:public BuZhen{
public:
BaGuaZhen(){}
~BaGuaZhen(){}
void ZhiXing(){
qDebug() << QStringLiteral("布八卦阵!");
}
};
class WuJiang{
public:
WuJiang(){}
~WuJiang(){}
virtual void LingMing() = 0;
};
class ZiLong:public WuJiang{
public:
ZiLong(){}
~ZiLong(){}
JiMou *jimou = new FanJianJi;
BuZhen *buzhen = new ChangSheZhen;
void LingMing(){
qDebug() << QStringLiteral("赵子龙领命!");
jimou->ShiXing();
buzhen->ZhiXing();
}
};
class GuanYu:public WuJiang{
public:
GuanYu(){}
~GuanYu(){}
JiMou *jimou = new KongChengJi;
BuZhen *buzhen = new BaGuaZhen;
void LingMing(){
qDebug() << QStringLiteral("关羽领命!");
jimou->ShiXing();
buzhen->ZhiXing();
}
};
调用时:
WuJiang *w1 = new ZiLong;
WuJiang *w2 = new GuanYu;
w1->LingMing();
w2->LingMing();
执行结果: