标签:style blog class c ext http
策略模式
策略模式定义了算法族,分别封装起来,让他们之间可以相互转换,此模式让算法的变化独立于使用算法的客户。
上面的定义看起来说的不太清楚,记定义无意义,理解策略模式还是要看书中的鸭子例子。假设设计一个模拟鸭子的游戏,鸭子的种类有很多,有红头鸭、绿头鸭等等,鸭子可以划水,可以呱嘎叫。在这个模拟游戏的实现上,自然会想到用继承的方法,定义一个鸭子基类,具体的鸭子类型继承自鸭子基类。如下图所示
所有鸭子都会飞、呱呱叫和游泳,这些功能由基类来实现,display函数用来输出鸭子实例的类型,由每个子类单独实现。
但现在问题来了,因为飞、呱呱叫、游泳都由基类实现,默认所有衍生类都有和基类相同的能力。事实上不是所有的鸭子都会飞,也不是所有的鸭子都呱呱叫,例如橡皮鸭。
要解决这个问题,简单的方法有两个,第一个是方法的覆盖或隐藏基类函数,例如橡皮鸭不能飞,那么在橡皮鸭的定义里生命fly()函数,覆盖或隐藏基类的fly()函数。这种方法的缺点是,每有一个不同于基类方法的子类,都需要单独声明并定义该方法。这样做对于对于继承关系复杂的类结构,添加或修改类都需要很大的工作量。
第二个方法是,将fly()等函数封装到接口中去,子类继承自这些接口,接口中的函数在子类中分别实现。这样做工作量也很大,无法实现方法的复用。
策略模式就是把一组行为,也就是一族算法封装成类.在定义新的鸭子子类时,不必为每一个子类分别定义其行为,而只需要在鸭子类中添加封装好的算法。在这个例子中,把飞和呱呱叫都封装成类,这些类独立于鸭子类,这种低耦合的方式更利于代码的维护。策略模式的另一个优点是可以更改鸭子的行为。详细内容参见下文代码。本次实例的UML类图如下所示:
#include<iostream>
usingnamespace std;
class IFlyBehavior
{
public:
virtualvoid Fly() = 0;
};
class IQuakBehavior
{
public:
virtualvoid Quack() = 0;
};
class FlyWithWings : public IFlyBehavior
{
public:
void Fly()
{
cout << "I can fly" << endl;
}
};
class FlyNoWay : public IFlyBehavior
{
public:
void Fly()
{
cout << "sorry, I cannot fly" << endl;
}
};
class SQuack : public IQuakBehavior
{
public:
void Quack()
{
cout << "I can Quack" << endl;
}
};
class MuteQuack : public IQuakBehavior
{
public:
void Quack()
{
cout << "sorry, I cannot quack" << endl;
}
};
class Duck
{
public:
IFlyBehavior *flyBehavior;
IQuakBehavior *quackBehavior;
void Swim()
{
cout << "I can swim" << endl;
}
virtualvoid Display()
{
cout << "I am a duck, " ;
}
void PerformaceFly()
{
Display();
flyBehavior->Fly();
}
void PerformanceQuack()
{
Display();
quackBehavior->Quack();
}
void SetFlyBehavior(IFlyBehavior *iFly)
{
flyBehavior = iFly;
}
void SetQuackBehavior(IQuakBehavior *IQuack)
{
quackBehavior = IQuack;
}
};
class RedHeadDuck : public Duck
{
public:
RedHeadDuck()
{
flyBehavior = new FlyWithWings();
quackBehavior = new SQuack();
}
void Display()
{
cout << "I am a red head duck, " ;
}
~RedHeadDuck()
{
delete flyBehavior;
delete quackBehavior;
}
};
class RubberDuck : public Duck
{
public:
RubberDuck()
{
flyBehavior = new FlyNoWay();
quackBehavior = new MuteQuack();
}
void Display()
{
cout << "I am a rubber duck, " ;
}
~RubberDuck()
{
delete flyBehavior;
delete quackBehavior;
}
};
void main()
{
RedHeadDuck redDuck;
RubberDuck rubberDuck;
redDuck.PerformaceFly();
redDuck.PerformanceQuack();
cout << endl;
rubberDuck.PerformaceFly();
rubberDuck.PerformanceQuack();
cout << endl;
rubberDuck.SetFlyBehavior(new FlyWithWings());
rubberDuck.SetQuackBehavior(new SQuack());
rubberDuck.PerformaceFly();
rubberDuck.PerformanceQuack();
system("pause");
}
Head First 设计模式之一 策略模式,布布扣,bubuko.com
标签:style blog class c ext http
原文地址:http://www.cnblogs.com/wangke1020/p/3736470.html