设计模式的 C++ 实现---策略模式

前文回顾
单例模式(一)
单例模式(二)
观察者模式
简单工厂模式
工厂方法模式(一)
工厂方法模式(二)
抽象工厂模式(一)
抽象工厂模式(二)
原型模式
外观模式
中介者模式
代理模式
装饰者模式

前言

所谓策略即解决一件事情的算法、或者方法,是一些具有相同签名的函数,把策略封装成对象(可以是类对象、也可以是任何形式的可调用对象),这样便可把策略定义为类的数据成员,就可以动态的设置数据成员的值,即更换策略。

实现举例

  1. 场景描述
    假设一个简单的游戏场景:玩家角色有攻击的动作,但根据装配武器的不同,会有不同的攻击效果。
  2. 策略基类
#include <iostream>
using namespace std;

class Attack
{
public:
    virtual void AttackMethod() = 0;
    ~Attack(){} ;
};
  1. 策略派生类
    ①.普通攻击
#include "attack.h"

class CommonAttack : public Attack
{
public:
    using Attack::Attack;
    void AttackMethod() override
    {
        cout <<"普通攻击,伤害+2"<<endl;
    }
};

②.匕首攻击

#include "attack.h"

class DaggerAttack : public Attack
{
public:
    using Attack::Attack;
    void AttackMethod() override
    {
        cout <<"匕首攻击,伤害+10"<<endl;
    }
};

③.手枪攻击

#include "attack.h"

class GunAttack : public Attack
{
public:
    using Attack::Attack;
    void AttackMethod() override
    {
        cout << "手枪攻击,伤害+50"<<endl;
    }

};
  1. 策略使用者
#include "commonattack.h"
#include <memory>

class Plaer
{
public:
    Plaer(const string &m_name,shared_ptr<Attack> m_attack = make_shared<CommonAttack>()):name(m_name),attack(m_attack){}
    void showAttack()
    {
        attack->AttackMethod();
    }
    void setAttack(shared_ptr<Attack> m_attack)
    {
        attack = m_attack;
    }
private:
    string name;
    shared_ptr<Attack> attack;

};
  1. 客户端调用
    在这里插入图片描述
#include "commonattack.h"
#include "daggerattack.h"
#include "gunattack.h"
#include "plaer.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    cout <<"***英雄刚出场,自带普通攻击***"<<endl;
    Plaer * hero = new Plaer("王者");
    hero->showAttack();
    cout << "***角色升级,获得匕首***"<<endl;
    shared_ptr<DaggerAttack> dagger = make_shared<DaggerAttack>();
    hero->setAttack(dagger);
    hero->showAttack();
    cout << "***角色升级,获得手枪***"<<endl;
    shared_ptr<GunAttack> gun = make_shared<GunAttack>();
    hero->setAttack(gun);
    hero->showAttack();

    return a.exec();
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值