企鹅的故事
本故事的主人公是企鵝小黑,他是一只鳥.
他繼承了鳥可以飛的屬性,但是小黑并不會(huì)飛.所以在這里企鵝是不能繼承鳥的.
?
如果我們這樣繼承了就違反了軟件設(shè)計(jì)的原則:
里氏替換原則:子類必需能夠替換掉它的父類型.也就是子類指針可以賦給父類
也就是要保證父類具有的屬性子類也必需有.
只有滿足這一點(diǎn)才能夠完美的繼承復(fù)用.
?
可不可以把鳥會(huì)飛的這個(gè)屬性去掉呢?這樣的話就違反了另外一個(gè)原則:
開閉原則:對(duì)擴(kuò)展開放對(duì)修改關(guān)閉.
?
也可能會(huì)想到,給小黑增加一個(gè)屬性:飛.把父類中的飛覆蓋掉不會(huì)任何事不就行了嗎?會(huì)飛的鳥就不實(shí)現(xiàn)飛的屬性,不會(huì)飛的就增加一個(gè)不做事.但這樣也不是很好吧,對(duì)每一個(gè)鳥類都要去考慮,要不要這個(gè)屬性多累啊.
?
但是現(xiàn)在假設(shè)我們就這么做:
鳥 小黑 = new 企鵝();
小黑.飛();
?
?
void 動(dòng)物世界::運(yùn)動(dòng)(鳥 tmp)
{
???????? tmp.飛();
}
動(dòng)物世界 aa;
aa.運(yùn)動(dòng)(new 企鵝());
?
這樣使用是不是很舒服啊,呵呵.只有子類型的可替換性才使得父類型的模塊在無需修改的情況下就可擴(kuò)展.所以在設(shè)計(jì)的時(shí)候一定要符合里氏替換原則.
?
?
這里用到了另外一個(gè)原則:依賴倒轉(zhuǎn)原則.
前段時(shí)候我可能說的不是很明白.
?
依賴倒轉(zhuǎn)原則:
高層模塊都依賴于抽象不依賴于具體實(shí)現(xiàn). 在這里動(dòng)物世界這個(gè)類沒有直接去使用企鵝這個(gè)類.
?
上面我們雖然假設(shè)企鵝可以繼承父類的飛的屬性,但這是假設(shè).現(xiàn)在應(yīng)該怎么進(jìn)行改進(jìn)呢?那就把飛的這個(gè)屬性給去掉吧,看下面的實(shí)現(xiàn)方法.
?
?
在這里我們使用策略模式.
?
企鵝從父類繼承了Flayable *flyornot的成員變量. 我們?cè)诔跏蓟簌Z的時(shí)候就給這個(gè)變量賦成FlyNoWay;
flayornot = new FlyNoWay();
這樣在調(diào)用 flayornot.fly(); 的時(shí)候由于FlyNoWay里面的fly函數(shù)是這樣的:
?
class FlyNoWay
{
public:
???????? void fly()
???????? {
?????????????????? cout << “cann’t fly”;
???????? }
};
所以企鵝就飛不起來了.完美解決了這個(gè)問題.
?
?
策略模式要和簡(jiǎn)單工廠模式時(shí)行對(duì)比,可以找到策略模式的缺點(diǎn),還有他們的共同點(diǎn)..
?
?
總結(jié)
- 上一篇: 《缠中说禅108课》79:分型的辅助操作
- 下一篇: Python 格式化输出详解