策略模式:定義了算法族,將其封裝起來,在其內部可相互替換。讓它的變化獨立於需要它的客戶類。
其C++例子實現如下:
/*
* CONTENTS: DESIGN PATTERN, STRATEGY PATTERN
* AUTHOR: YAO H. WANG
* TIME: 2013-10-17 17:08:34
* EDITION: 1
*
* ALL RIGHTS RESERVED!
*/
#include <iostream>
using namespace std;
/*
* 原則1:把變化的部分和不變的部分分開。
* 飛行行爲和呱呱叫行爲
*/
//飛行行爲
class FlyBehavior
{
public:
virtual void fly() = 0;
};
class FlyWithWings: public FlyBehavior
{
public:
void fly()
{
cout << "I'm flying!!" << endl;
}
};
class FlyNoWay: public FlyBehavior
{
public:
void fly()
{
cout << "I can't fly" << endl;
}
};
class FlyRocketPowered: public FlyBehavior
{
public:
void fly()
{
cout << "I'm flying with a rocket!" << endl;
}
};
//呱呱叫行爲
class QuackBehavior
{
public:
virtual void quack() = 0;
};
class Quack: public QuackBehavior
{
public:
void quack()
{
cout << "Quack" << endl;
}
};
class MuteQuack: public QuackBehavior
{
public:
void quack()
{
cout << "<< Silence >>" << endl;
}
};
class Squeak: public QuackBehavior
{
public:
void quack()
{
cout << "Squeak" << endl;
}
};
//客戶類——鴨子
class Duck
{
public:
/*
* 原則2:多組合,少繼承
*/
FlyBehavior *flyBehavior;
QuackBehavior *quackBehavior;
private:
virtual void display() = 0;
public:
virtual void performFly()
{
flyBehavior->fly();
}
virtual void performQuack()
{
quackBehavior->quack();
}
virtual void setFlyBehavior(FlyBehavior *fb)
{
flyBehavior = fb;
}
virtual void setQuackBehavior(QuackBehavior *qb)
{
quackBehavior = qb;
}
virtual ~Duck()
{
}
};
class MallardDuck: public Duck
{
public:
MallardDuck()
{
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
void display()
{
cout << "I'm a real Mallard duck" << endl;
}
~MallardDuck()
{
delete flyBehavior;
delete quackBehavior;
}
};
class ModelDuck: public Duck
{
public:
ModelDuck()
{
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
void display()
{
cout << "I'm a model duck" << endl;
}
~ModelDuck()
{
delete flyBehavior;
delete quackBehavior;
}
};
//測試
void main()
{
/*
* 原則3: 針對接口編程,而不是針對實現編程
*/
Duck* mallard = new MallardDuck();
mallard->performFly();
mallard->performQuack();
Duck* model = new ModelDuck();
model->performFly();
model->setFlyBehavior(new FlyRocketPowered());
model->performFly();
delete mallard;
delete model;
}