c++ Strategy模式

由function pointers和std::function完成的strategy模式;
class GameCharacter;
int defaultHealthCalc(const GameCharacter& gc){return 1;};
int loseHealthQuickly(const GameCharacter& gc){ cout<<“loseHealthQuickly”<<endl; return 2;};
int loseHealthSlowly(const GameCharacter& gc){ cout<<“loseHealthSlowly”<<endl; return 3;};
short calcHealth(const GameCharacter&) {return 4;};
class GameCharacter {
public:
//如下两个typedef的区别在于,第一个调用时一个必须是此类型的函数指针;
//第二个是可以进行转型的
//typedef int (*HealthCalcFunc)(const GameCharacter&);
typedef std::function<int (const GameCharacter&)> HealthCalcFunc;
explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)
: healthFunc(hcf)
{ cout<<“base constructor”<<endl;}

GameCharacter() 
{
    cout<<"default base constructor"<<endl;
}
int healthValue() const
{ return healthFunc(*this); }

private:
HealthCalcFunc healthFunc;
};

class EvilBadGuy: public GameCharacter {
public:
explicit EvilBadGuy(HealthCalcFunc hcf = defaultHealthCalc)
: GameCharacter(hcf) //Attention: 当该函数参数没有默认参数时:explicit EvilBadGuy(HealthCalcFunc hcf),除非显示调用父类的带参构造函数,否则默认调用的是父类的default构造函数或者无参的构造函数,如果父类只提供带参构造函数,编译器则不会自动提供default构造函数,这时编译就会报错
{cout<<“child constructor”<<endl;}

};

int main()
{
EvilBadGuy ebg1(loseHealthQuickly); //用
EvilBadGuy ebg2(loseHealthSlowly);
EvilBadGuy ebg3(calcHealth); //在typedef int (*HealthCalcFunc)(const GameCharacter&);是会报错的,只能用可转型的typedef
return 0;
}

古典的Strategy模式:
class GameCharacter;

class HealthCalcFunc {
public:
virtual int calc(const GameCharacter& gc) const
{}
}

class GameCharacter {
public:
explicit GameCharacter(HealthCalcFunc *hcf)
: pHealthFunc(hcf)
{ cout<<“base constructor”<<endl;}

GameCharacter() 
{
    cout<<"default base constructor"<<endl;
}
int healthValue() const
{ return hcf->calc(*this); }

private:
HealthCalcFunc* pHealthFunc;
};

下面是一个使用策略设计模式的示例代码(C++): ```cpp #include <iostream> // 策略接口 class Strategy { public: virtual void execute() = 0; }; // 具体策略类A class ConcreteStrategyA : public Strategy { public: void execute() override { std::cout << "执行具体策略A" << std::endl; } }; // 具体策略类B class ConcreteStrategyB : public Strategy { public: void execute() override { std::cout << "执行具体策略B" << std::endl; } }; // 上下文类 class Context { private: Strategy* strategy; public: Context(Strategy* strategy) : strategy(strategy) {} void executeStrategy() { strategy->execute(); } }; // 客户端代码 int main() { // 创建具体策略对象 Strategy* strategyA = new ConcreteStrategyA(); Strategy* strategyB = new ConcreteStrategyB(); // 创建上下文对象,并传入具体策略对象 Context contextA(strategyA); Context contextB(strategyB); // 执行具体策略 contextA.executeStrategy(); // 输出:执行具体策略A contextB.executeStrategy(); // 输出:执行具体策略B delete strategyA; delete strategyB; return 0; } ``` 在上述示例代码中,我们定义了一个策略接口 `Strategy`,并要求具体的策略类继承并实现该接口。具体的策略类 `ConcreteStrategyA` 和 `ConcreteStrategyB` 分别提供了不同的算法实现。 上下文类 `Context` 包含一个策略接口指针,并通过调用策略接口的方法来执行具体的策略。 在客户端代码中,我们创建了具体的策略对象,并将其传递给上下文对象。然后,通过调用上下文对象的 `executeStrategy()` 方法来执行具体的策略。 运行代码将输出不同的策略执行结果。 这个示例展示了策略设计模式的基本结构和使用方式,并在 C++ 中实现了它。通过使用策略模式,可以方便地切换和扩展算法,同时保持了客户端代码的简洁性和可读性。记得在程序结束时删除动态分配的内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值