zoukankan      html  css  js  c++  java
  • 设计模式之实现策略模式

    /****************************************************************

    CCharactor.h

    ****************************************************************/

    #pragma  once
    #include "CWeapon.h"

    //////////////////////////////////////////////////////
    //这是人物类的纯虚基类
    class CCharactor
    {
    protected:
     //多用组合,少用继承。 
     //这里使用策略模式。
     CWeaponBehavior* m_weapon;

    public:
     virtual void fight(){
      if(m_weapon)
       m_weapon->useWeapon();
     }

     //纯虚函数
     virtual void display() = 0;

     //策略模式: 更改策略
     void setWeapon(CWeaponBehavior* newWeapon){
      if(m_weapon){
       delete m_weapon;
      }
      m_weapon  = newWeapon;
     }

    public:
     CCharactor(): m_weapon(NULL) {}
     ~CCharactor(){
      if(m_weapon)
       delete m_weapon;
     }
    };

    ////////////////////////////////////////////////////////////////
    //弓箭手类
    class CBowerCharactor : public CCharactor
    {
    public:
     void display(){
      cout<<"I'm a Bower"<<endl;
     }

    public:
     CBowerCharactor(){
      //2. 要针对接口编程,而不针对实现编程。
      m_weapon = new CBowAndArrowBehaVior();
     }
    };

    //////////////////////////////////////////////////////////////
    //剑手类
    class CSwordCharactor : public CCharactor
    {
    public:
     void display(){
      cout<<"I'm a Sworder"<<endl;
     }

    public:
     CSwordCharactor(){
      m_weapon = new CSwordBehavior();
     }
    };

    /**************************************************************

    CWeapon.h

    **************************************************************/

    #pragma  once
    #include <iostream>
    using namespace std;

    //1. 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
    //2. 要针对接口编程,而不针对实现编程。

    //Weapon的抽象接口。所以有Weapon都要从这里得以继承并实现
    class CWeaponBehavior
    {
    public:
     virtual void useWeapon() = 0;
    };


    //匕首类
    class CKnifeBehavior : public CWeaponBehavior
    {
    public:
     virtual void useWeapon(){
      cout<<"You're using weapon: Knife"<<endl;
     }
    };

    //弓箭
    class CBowAndArrowBehaVior : public CWeaponBehavior
    {
    public:
     virtual void useWeapon(){
      cout<<"You're using weapon: Bow And Arrow"<<endl;
     }
    };

    //剑
    class CSwordBehavior : public CWeaponBehavior
    {
    public:
     virtual void useWeapon(){
      cout<<"You're using weapon: Sword"<<endl;
     };
    };

    /*****************************************************************

    testStrategy.cpp

    ****************************************************************/

    /*
    设计模式: 策略模式

    定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

    @@@@@@@@@@@@@@@@@@@@@@@@@@@
    这个程序做的事:
             定义一个角色类 CBowerCharactor
       这个角色类运用策略模式定义了一个替换策略的方法setWeapon(), 其参数就是一个策略的实例
       然后角色类的fight()方法可以使用策略,这样就把实现与调用解耦了。
    @@@@@@@@@@@@@@@@@@@@@@@@@@@
    */
    #include "CCharactor.h"

    int main()
    {
     CBowerCharactor* c1 = new CBowerCharactor();
     c1->display();
     c1->fight();
     c1->setWeapon(new CSwordBehavior);
     c1->fight();
     return 0;
    }

  • 相关阅读:
    jmeter_04_常用取样器
    jmeter_03_鉴权
    jmeter_02_目录文档说明
    jmeter_01_常用快捷键
    Web Api 与 Andriod 接口对接开发经验
    Eclipse自动生成作者、日期注释等功能设置
    c#解析XML到DATASET及dataset转为xml文件函数
    Jquery 仿 android Toast效果
    正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法
    异步网络加载开源框架AsyncHttpClient使用
  • 原文地址:https://www.cnblogs.com/skyofbitbit/p/2756532.html
Copyright © 2011-2022 走看看