模擬鴨子
Joe上班的公司做了一套相當(dāng)成功的模擬鴨子游戲:SimDuck赁咙。游戲中會(huì)出各種鴨子。用OO的方式設(shè)計(jì)葡公,會(huì)游泳,呱叫条霜。
[圖片上傳失敗...(image-23f71a-1555394540497)]
現(xiàn)在我們得讓鴨子能飛
Joe直接在父類中添加了fly()方法
但是問題出現(xiàn)
出現(xiàn)了一只會(huì)叫的橡皮鴨RubberDuck
因?yàn)橄鹌喞^承父類催什,所以就自帶fly()方法,但這是不合理的
可能蛔外,可以將fly()設(shè)置為虛函數(shù)蛆楞,這樣在子類中重寫fly就可以了
但是,這樣重復(fù)的代碼會(huì)變得很多夹厌,可能每出現(xiàn)一個(gè)新子類都要覆蓋一下這個(gè)方法豹爹。(可能頭發(fā)都是這么禿的哈哈)
so?應(yīng)該怎么做才好
分開變化和不變的部分(這里先只把fly當(dāng)作變化的部分矛纹,偷懶嘿嘿)
關(guān)鍵思路臂聋,將飛行fly動(dòng)作委托(delegate)給其它人處理
新建了一個(gè)FlyBehavior的接口(抽象基類),并在Duck中使用;
注意抽象基類無法實(shí)例化孩等,只能聲明成指針艾君;
下面代碼闡述了主要思想(我偷懶沒有寫析構(gòu),注意new出來的要delete肄方,我為了代碼長度沒寫冰垄,其實(shí)是懶QAQ)
setfly()方法可以更換飛行方式
#include<iostream>
using namespace std;
//---------------------------------------------
#include<iostream>
using namespace std;
//---------------------------------------------
class FlyBehavior{//飛行接口/抽象基類
public:
virtual void fly()=0;
};
class FlyWithWings:public FlyBehavior{
public:
virtual void fly(){
cout<<"FlyWithWings"<<endl;
}
};
class FlyNoWay:public FlyBehavior{
public:
virtual void fly(){
cout<<"i can't fly"<<endl;
}
};
//----------------------------------------------
class Duck{//鴨子的抽象基類/父類
public:
FlyBehavior * flyBehavior;//注意這里是指針哦
virtual void performfly()=0;
virtual void setfly(FlyBehavior * wht)=0;
};
class ADuck:public Duck{
public:
ADuck(){
flyBehavior = new FlyWithWings();
}
virtual void performfly(){
flyBehavior->fly();
}
virtual void setfly(FlyBehavior * wht){
flyBehavior = wht;
}
};
//---------------------------------------------
int main(){
Duck * yazi;
yazi = new ADuck();
yazi->performfly();
yazi->setfly(new FlyNoWay());
yazi->performfly();
return 0;
}
/*out
FlyWithWings
i can't fly
*/
策略模式——定義算法族,分別封裝起來权她,讓它們之間可以互相替換虹茶,此模式讓算法的變化獨(dú)立于使用算法的客戶。