什么是设计模式?
我们写软件追求的一个终极目标就是“高内聚,低耦合”。设计模式就是一组实现这个目标的最佳实践。
软件开发过程的一个不变真理是“变化”,新需求的添加,旧代码的改善都是变化,怎样用最少的影响来处理这些变化,这个问题正是设计模式致力于解决的。
我打算以《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;
}