第一章 设计模式入门之策略模式【C++11版】

什么是设计模式?

我们写软件追求的一个终极目标就是“高内聚,低耦合”。设计模式就是一组实现这个目标的最佳实践。

软件开发过程的一个不变真理是“变化”,新需求的添加,旧代码的改善都是变化,怎样用最少的影响来处理这些变化,这个问题正是设计模式致力于解决的。

我打算以《Head First 设计模式》为参考,总结出重点,并用C++11完整实现书中的代码,按照原书的章节顺序,不定期更新。

设计原则

设计原则1:

找到应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

设计原则2:

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

设计原则3:

多用组合,少用继承。组合可以在运行时动态地改变对象的行为,而继承不行。

策略模式(Strategy Pattern)

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

代码实现

需求

某公司设计了一套模拟鸭子游戏:SimUDuck,游戏中会出现各种鸭子,一边swim、一边quack,还可以fly,现在为不同的鸭子设定不同的行为,设计一个Duck超类,并让各种鸭子继承此超类。

分析

对于相同的行为,将其实现在超类中,方便各个子类复用;对于子类间不同的行为,将其抽象出来,以接口的形式表现,使各个不同的行为可以互相替换。

#include <iostream>
#include <functional>

using namespace std;

class Duck {
public:
    typedef function<void ()> FlyBehavior;
    typedef function<void ()> QuackBehavior;

    Duck() = default;
    virtual ~Duck() = 0;

    void swim() { cout << "I'm swimming..." << endl; }

    void fly() { flyBehavior_(); }
    void quack() { quackBehavior_(); }


    void setFlyBehavior(const FlyBehavior& flyBehavior) {
        flyBehavior_ = flyBehavior;
    }

    void setQuackBehavior(const QuackBehavior& quackBehavior) {
        quackBehavior_ = quackBehavior;
    }

protected:
    FlyBehavior flyBehavior_;
    QuackBehavior quackBehavior_;
};

// for sub class
Duck::~Duck() {
}

static Duck::FlyBehavior readheadFly = [] {
    cout << "readheadFly: flying..." << endl;
};

static Duck::FlyBehavior rubberFly = [] {
    cout << "rubberFly: flying..." << endl;
};

static Duck::QuackBehavior readheadQuack = [] {
    cout << "readheadQuack: quacking..." << endl;
};

static Duck::QuackBehavior rubberQuack = [] {
    cout << "rubberQuack: quacking..." << endl;
};

class RedheadDuck : public Duck {
public:
    RedheadDuck() {
        flyBehavior_ = readheadFly;
        quackBehavior_ = readheadQuack;
    }
};

class RubberDuck : public Duck {
public:
    RubberDuck() {
        flyBehavior_ = readheadFly;
        quackBehavior_ = readheadQuack;
    }
};

int main(int argc, char** argv) {
    Duck* duck = new RedheadDuck();
    duck->fly();
    duck->quack();
    duck->swim();

    cout << "changing behavior..." << endl;
    duck->setFlyBehavior(rubberFly);
    duck->fly();

    // Duck noCompile = Duck();
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值