策略模式

模拟鸭子

Joe上班的公司做了一套相当成功的模拟鸭子游戏:SimDuck。游戏中会出各种鸭子。用OO的方式设计,会游泳,呱叫。
[图片上传失败...(image-23f71a-1555394540497)]

现在我们得让鸭子能飞

Joe直接在父类中添加了fly()方法


1-2

但是问题出现

出现了一只会叫的橡皮鸭RubberDuck


1-3

因为橡皮鸭继承父类,所以就自带fly()方法,但这是不合理的
可能,可以将fly()设置为虚函数,这样在子类中重写fly就可以了
但是,这样重复的代码会变得很多,可能每出现一个新子类都要覆盖一下这个方法。(可能头发都是这么秃的哈哈)

so?应该怎么做才好

分开变化和不变的部分(这里先只把fly当作变化的部分,偷懒嘿嘿)
关键思路,将飞行fly动作委托(delegate)给其它人处理


1-4

新建了一个FlyBehavior的接口(抽象基类),并在Duck中使用;
注意抽象基类无法实例化,只能声明成指针;
下面代码阐述了主要思想(我偷懒没有写析构,注意new出来的要delete,我为了代码长度没写,其实是懒QAQ)
setfly()方法可以更换飞行方式

#include<iostream>
using namespace std;
//---------------------------------------------
#include<iostream>
using namespace std;
//---------------------------------------------
class FlyBehavior{//飞行接口/抽象基类
public:
    virtual void fly()=0;
};
class FlyWithWings:public FlyBehavior{
public:
    virtual void fly(){
        cout<<"FlyWithWings"<<endl;
    }
};
class FlyNoWay:public FlyBehavior{
public:
    virtual void fly(){
        cout<<"i can't fly"<<endl;
    }
};
//----------------------------------------------
class Duck{//鸭子的抽象基类/父类
public:
    FlyBehavior * flyBehavior;//注意这里是指针哦
    virtual void performfly()=0;
    virtual void setfly(FlyBehavior * wht)=0;

};
class ADuck:public Duck{
public:
    ADuck(){
        flyBehavior = new FlyWithWings();
    }
    virtual void performfly(){
        flyBehavior->fly();
    }
    virtual void setfly(FlyBehavior * wht){
        flyBehavior = wht;
    }

};
//---------------------------------------------
int main(){
    Duck * yazi;
    yazi = new ADuck();
    yazi->performfly();
    yazi->setfly(new FlyNoWay());
    yazi->performfly();
    return 0;
}
/*out
FlyWithWings
i can't fly
*/

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文参照《Head First 设计模式》,转载请注明出处对于整个系列,我们按照这本书的设计逻辑,使用情景分析的方...
    诡异的叶子阅读 3,798评论 0 5
  • layout: posttitle: "PHP设计模式(三)-策略模式"date: 2016-06-06 10:3...
    EwanRenton阅读 3,388评论 0 0
  • 1.定义 策略模式:定义了算法簇[cù],分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的...
    TheTempest阅读 3,385评论 0 0
  • 过2天考研大军就要开考了,去年考研的经历还历历在目,这么快整整一年就过去了。今天来缅怀一下曾为考研大军的一员,一是...
    小秋在唱歌阅读 1,514评论 1 1
  • 时间管理就是生命管理! 改变--从我开始!早安!~优秀是一种习惯 20180802 53/90 高玲玲@重庆 个人...
    向往南天的南天阅读 472评论 0 0