定义DUCK类来作为一个超类,所有的鸭子类都继承它,但是这不能很好的解决问题,因为鸭子的行为字子类中不停的改变,并且让所有的子类都有这些行为是不恰当的,使用接口,虽然可以解决,但不能解决代码复用的问题,因为接口不具有实现代码,因此:
我们应该找出应用中可能需要变化之处,把他们独立出来,和那些不需要变化的分离开。使得代码变化引起的不经意后果变少,系统更有弹性。
尽量多用组合,少用继承!!使用组合不仅可以将算法族封装成类,还可以在运行时动态的改变行为,只要组合的行为对象符合正确的接口标准。
策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换,让算法的变化独立于使用算法的客户。
// DesignPattern.cpp : 定义控制台应用程序的入口点。
//
#include
using namespace std;
class FlyBehavior{ //飞行行为类
public:
virtual void fly()=0;
};
class FlyWithWings :public FlyBehavior{
public:
void fly(){
cout << "I am flying";
}
};
class FlyNoWay :public FlyBehavior{
public:
void fly(){
cout << "I can not fly";
}
};
class QuackBehavior{ //鸭子叫声行为类
public:
virtual void quack()=0;
};
class Quack :public QuackBehavior{
public:
void quack(){
cout << "Quack";
}
};
class MuteQuack :public QuackBehavior{
public:
void quack(){
cout << "science";
}
};
class Squack :public QuackBehavior{
public:
void quack(){
cout << "squeak";
}
};
class Duck{
public:
FlyBehavior *flyBehavior;
QuackBehavior *quackBehavior;//组合起来,使具体的鸭子类来继承他们
Duck(){};
virtual void display() = 0;
void performFly(){
flyBehavior->fly();
}
void performQuack(){
quackBehavior->quack();
}
void setFlyBehavior(FlyBehavior *fb){
flyBehavior = fb;
}
void setQuackBehavior(QuackBehavior *qb){
quackBehavior = qb;
}
};
class MallardDuck :public Duck{
public:
MallardDuck(){
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
void display(){
cout << "I am a real Mallard duck"<
performFly(); //可以飞行
mallard->setFlyBehavior(new FlyNoWay());//然后动态的设定不可以飞行,而不用改变原来的代码
mallard->performFly();
mallard->performQuack();
return 0;
}
现在我们可以动态的增加鸭子的新行为,也可以增加行的鸭子类,然后动态的设定它的行为,而不用去修改原来的代码。
C++中,当一个类的成员函数均为纯虚函数时,就相当于JAVA中的接口。