定義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中的接口。