设计模式之策略模式

查看目录请点人家 ˙ω˙

模拟鸭子

Joe上班的公司做了一套相当成功的模拟鸭子游戏:SimDuck。游戏中会出各种鸭子。用OO的方式设计,会游泳,呱叫。
1-1

现在我们得让鸭子能飞

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
*/

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值