0
点赞
收藏
分享

微信扫一扫

Head First 设计模式——chapter1 策略模式C++实现

腊梅5朵 2022-04-14 阅读 158
c++

设计模式:

        设计模式可以告诉我们如何组织类和对象以解决某种问题。构造OO系统的经验被整合成了不同的设计模式。建立可维护的OO系统,要点在于随时想到系统以后可能需要的变化及应对变化的原则。模式是针对设计问题的通用解决方案,可以让开发人员之间有共享的语言,能最大化沟通价值。

策略模式的原则:

一、 封装变化

找出应用中可能需要变化之处,将其独立出来,不要和不需要变化的代码混在一起

将鸭子类和容易改变的飞行,呱呱叫类分开。

二、针对接口编程,而不是针对实现

将具体行为编写在飞行行为,呱呱叫行为类中,而非对每个鸭子类实现行为接口。使得这些行为与鸭子类无关,可以被其他对象复用。

三、多用组合,少用继承

将鸭子的行为和鸭子类组合使用,组合有更大的弹性。

总结:

策略模式:

        将行为想象为一族算法,定义算法族,分别封装起来,让他们之间可以互相替换,使得算法的变化独立于使用算法的客户。


#include <stdio.h>


//fly行为抽象类
class FlyBehavior {
public:
    virtual void fly()=0;
};

//会飞的鸭子
class FlywithWings :public FlyBehavior {
public:
    void fly() { printf("I'm flying\n"); }
};

//不会飞的鸭子 eg:橡皮鸭
class FlyNoWay :public FlyBehavior {
public:
    void fly() { printf("I can't fly\n"); }
};

//用火箭动力飞的鸭子
class FlayRocketPowered :public FlyBehavior {
public:
    void fly() { printf("I'm flying with a rocket\n"); }
};

//quack行为抽象类
class QuackBehavior {
public:
    virtual void quack()=0;
};


//不同叫声的鸭子
class Quack :public QuackBehavior {
public:
    void quack() { printf("Quack...\n"); }
};

class MuteQuack :public QuackBehavior {
public:
    void quack() { printf("silence\n"); }
};

class Squeak :public QuackBehavior {
public:
    void quack() { printf("squaek...\n"); }
};


class Duck {
    
public:
    
    void performerQuack() { quackBehavior->quack(); }
    void performerFly() { flyBehavior->fly(); }
    virtual void display()=0;

    //在运行时可以改变鸭子行为
    void setQuackBehavior(QuackBehavior* qb) { quackBehavior = qb; }
    //用右值实现移动语义
    void setFlyBehavior(FlyBehavior&& fb) { flyBehavior = &fb; }

    QuackBehavior *quackBehavior;
    FlyBehavior *flyBehavior;
};

//野鸭
class MallardDuck :public Duck
{
public:
    MallardDuck() {
        display();
        quackBehavior = new Quack();
        flyBehavior = new FlywithWings();
    }
    void display() { printf("I'm a really Mallard Duck\n"); }
};

//模型鸭
class ModelDuck :public Duck
{
public:
    ModelDuck() {
        display();
        quackBehavior = new Quack();
        flyBehavior = new FlyNoWay();
    }
    void display() { printf("I'm a model Duck\n"); }
};


int main()
{
    Duck* mallard = new MallardDuck();
 
    mallard->performerFly();
    mallard->performerQuack();
    
    
    printf("\n");
    Duck* modelduck = new ModelDuck();
    modelduck->performerFly();
    modelduck->performerQuack();
    modelduck->setFlyBehavior( FlayRocketPowered());
    modelduck->performerFly();
    modelduck->setQuackBehavior(new Squeak());
    modelduck->performerQuack();

    delete(mallard);
    delete(modelduck);

    system("pause");
    return 0;
}
举报

相关推荐

0 条评论