首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C++实现 策略模式

C++实现 策略模式

概述:

每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。 而策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
类图与实例:

Context(应用场景):

1、需要使用ConcreteStrategy提供的算法。

2、内部维护一个Strategy的实例。

3、负责动态设置运行时Strategy具体的实现算法。

4、负责跟Strategy之间的交互和数据传递。

Strategy(抽象策略类):定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。

ConcreteStrategy(具体策略类):实现了Strategy定义的接口,提供具体的算法实现。

这里用CS里的人物作为例子,每个人都可以有几个武器,武器之间动态切换,武器拥有统一的攻击命令:

    #include <iostream>
    using namespace std;
     
    class WeaponBehavior
    {
    public:
        void virtual useWeapon() = 0;
    };
     
    class AK47:public WeaponBehavior
    {
    public:
        void useWeapon()
        {
            cout << "Use AK47 to shoot!" << endl;
        }
    };
     
    class Knife:public WeaponBehavior
    {
    public:
        void useWeapon()
        {
            cout << "Use Knife to kill!" << endl;
        }
    };
     
    class Character
    {
    public:
        Character()
        {
            weapon = 0;
        }
        void setWeapon(WeaponBehavior *w)
        {
            this->weapon = w;
        }
        void virtual fight() = 0;
    protected:
        WeaponBehavior *weapon;
    };
     
    class King:public Character
    {
    public:
        void fight()
        {
            cout << "The king:" ;
            if ( this->weapon == NULL)
            {
                cout << "You don't have a weapon! Please Set Weapon!" << endl;
            }
            else
            {
                weapon->useWeapon();
            }
        }
    };
    int main()
    {   
        WeaponBehavior *ak47 = new AK47();
        WeaponBehavior *knife = new Knife();     
     
        Character *kin = new King();      
     
        kin->fight();   
        cout << endl;
     
        kin->setWeapon(ak47);
        kin->fight();
        cout << endl;
     
        kin->setWeapon(knife);
        kin->fight();
     
        return 0;
}
返回列表