条款 35

一,应用场景

假设我们在设计一款游戏,我们为游戏中的人物设计一个继承体系,不同的人物有不同的计算健康程度的方法,因此我们在基类中声明一个虚函数

class GameCharacter{
public:
    virtual int healthValue() const;  //返回人物的健康指数
};


二,使用Strategy模式替换虚函数
//前置声明
class GameCharacter;
//计算健康指数的缺省方法
int defaultHealthFunc(const GameCharacter& gc){}
class GameCharacter{
private:
    HealthFunc healthFunc;
public:
    typedef int (*HealthFunc)(const GameCharacter& gc);
    GameCharacter(HealthFunc hf = defaultHealthFunc):healthFunc(hf){
    }
};


1,同一人物类型之不同实体可以有不同的计算健康指数的方法

int func1(const GameCharacter& gc){}
int func2(const GameCharacter& gc){}

EvilBadGuy ebg1(func1);  //相同类型的人物,有不同的计算健康的方式
EvilBadGuy ebg2(func2);


2,某已知人物之健康指数计算函数可以在运行期变更

例如:GameCharacter可提供一个成员函数setHealthFunc,用来替换当前的健康指数计算函数。

//前置声明
class GameCharacter;
//计算健康指数的缺省方法
int defaultHealthFunc(const GameCharacter& gc){}
class GameCharacter{
private:
    HealthFunc healthFunc;
public:
    typedef int (*HealthFunc)(const GameCharacter& gc);
    GameCharacter(HealthFunc hf = defaultHealthFunc):healthFunc(hf){
    }
    void setHealthFunc(HealthFunc hf){
        healthFunc = hf;
    }
};

int func1(const GameCharacter& gc){}
int func2(const GameCharacter& gc){}

EvilBadGuy ebg;
ebg.setHealthFunc(func1);
ebg.setHealthFunc(func2);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值