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.针对接口编程。

  • 相关阅读:
    SQL Azure (17) SQL Azure V12
    Microsoft Azure News(5) Azure新DV2系列虚拟机上线
    Azure Redis Cache (3) 在Windows 环境下使用Redis Benchmark
    Azure PowerShell (11) 使用自定义虚拟机镜像模板,创建Azure虚拟机并绑定公网IP(VIP)和内网IP(DIP)
    Windows Azure Virtual Machine (31) 迁移Azure虚拟机
    Windows Azure Web Site (16) Azure Web Site HTTPS
    Azure China (12) 域名备案问题
    一分钟快速入门openstack
    管理员必备的Linux系统监控工具
    Keepalived+Nginx实现高可用和双主节点负载均衡
  • 原文地址:https://www.cnblogs.com/kex1n/p/2335898.html
Copyright © 2011-2022 走看看