zoukankan      html  css  js  c++  java
  • 策略(Strategy)模式

    策略(Strategy)模式,是比较简单的一种设计模式,但它的应用却随处可见。下面模拟游戏中常用的打斗场面,来理解策略模式。在游戏中,通常有n个角色,每个角色都能发出动作:fight。每个角色都使用不同的武器,并且可以更换武器。下面是此场景简化的C++实现:

        Strategy.h

    #ifndef _STRETEGY_H_
    #define _STRETEGY_H_

    //定义武器接口
    class WeaponBehavior
    {
    public:
        
    void virtual useWeapon() = 0;
    }
    ;

    class Sword:public WeaponBehavior
    {
    public:
        
    void useWeapon();
    }
    ;

    class Axe:public WeaponBehavior
    {
    public:
        
    void useWeapon();
    }
    ;

    class Arrow:public WeaponBehavior
    {
    public:
        
    void useWeapon();
    }
    ;

    class Knife:public WeaponBehavior
    {
    public:
        
    void useWeapon();
    }
    ;

    //定义角色接口
    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();
    }
    ;

    class Queen:public Character
    {
    public:
        
    void fight();
    }
    ;

    class Knight:public Character
    {
    public:
        
    void fight();
    }
    ;

    class Troll:public Character
    {
    public:
        
    void fight();
    }
    ;


    #endif


    说明:
        1.因为每个武器的使用方式不同,所以将使用武器的行为封装成接口,利用此接口调用具体武器的useWeapon行为。
        2.因为每个角色都有打斗,更换武器的行为,各个角色的打斗行为不同,而更换武器的行为相同,所以将setWeapon在Character中实现,而打斗行为在各个具体的角色中实现。

    Strategy.cpp

    #include <iostream>
    #include 
    "Strategy.h"
    using namespace std;
    void Sword::useWeapon()
    {
        cout 
    << "Use Sword to stuck!" << endl;
    }


    void Axe::useWeapon()
    {
        cout 
    << "Use Axe to chop!" << endl;
    }


    void Knife::useWeapon()
    {
        cout 
    << "Use Knife to kill!" << endl;
    }


    void Arrow::useWeapon()
    {
        cout 
    << "Use arrow!" << endl;
    }


    void King::fight()
    {
        cout 
    << "The king:" ;
        
    if ( this->weapon == NULL)
        
    {
            cout 
    << "You don't have a weapon! Please Set Weapon!" << endl;
        }

        
    else
        

            weapon
    ->useWeapon();
        }

    }


    void Queen::fight()
    {
        cout 
    << "The Queen:" ;
        
    if ( this->weapon == NULL)
        
    {
            cout 
    << "You don't have a weapon! Please Set Weapon!" << endl;
        }

        
    else
        
    {  
            weapon
    ->useWeapon();
        }

    }


    void Knight::fight()
    {
        cout 
    << "The Knight:" ;
        
    if ( this->weapon == NULL)
        
    {
            cout 
    << "You don't have a weapon! Please Set Weapon!" << endl;
        }

        
    else
        
    {  
            weapon
    ->useWeapon();
        }

    }


    void Troll::fight()
    {
        cout 
    << "The Troll:";
        
    if ( this->weapon == NULL)
        
    {
            cout 
    << "You don't have a weapon! Please Set Weapon!" << endl;
        }

        
    else
        
    {  
            weapon
    ->useWeapon();
        }

    }



    main.cpp

    #include <iostream>
    #include 
    "Strategy.h"
    using namespace std;
    int main()
    {
        
    //声明武器
        WeaponBehavior *sw = new Sword();//声明剑
        WeaponBehavior *axe = new Axe();//声明斧头
        WeaponBehavior *arr = new Arrow();//声明弓箭
        WeaponBehavior *kn = new Knife();//声明刀
        
        
    //声明角色
        Character *kin = new King();
        Character 
    *qu = new Queen();
        Character 
    *kni = new Knight();
        Character 
    *tr = new Troll();
        
        
    //调用打斗行为
        kin->fight();
        qu
    ->fight();
        kni
    ->fight();
        tr
    ->fight();
        cout 
    << endl;

        
    //更换武器
        kin->setWeapon(sw);
        kin
    ->fight();
        cout 
    << endl;

        kin
    ->setWeapon(arr);
        kin
    ->fight();

        
    return 0;
    }



    策略(Strategy)模式体现了2个重要的面向对象设计原则:
        1.封装变化。
        2.针对接口编程。

  • 相关阅读:
    观察者模式的结构
    策略模式
    EJB 配置多个数据源
    EJB3 调用的存储过程
    Android学习笔记_49_Android中自定义属性(attrs.xml,TypedArray的使用)
    Android学习笔记_48_若水新闻客户端源码剖析
    博客样式
    oracle 基础知识(四)常用函数
    oracle 基础知识(三)
    oracle 基础语法(二)
  • 原文地址:https://www.cnblogs.com/kex1n/p/2335898.html
Copyright © 2011-2022 走看看