舉個我們最常用的Photoshop做例子。
在Photoshop中,有許多圖形工具,比如星星,比如方形,再比如圓形等等。
在Photoshop中,不用多說,也有很多種顏色供我們選擇。
於是就產生了,紅色的星星,綠色的星星。紅色的方形,綠色的方形等等。
看看所產生的樹:
現在是三種圖形,三種顏色,於是我們就一共去聲明了九個類,當然我們還不算中間過程中的輔助父類。
如果我們現在是18種圖形,12種顏色,那麼我們就需要寫18*12個類,然後加上12個顏色的類和一個總父類,一共我們需要12*18+12+1=229個類。
採用多繼承
用多繼承描述這個模型再恰當不過了。聲明18個圖形的類,然後聲明12個顏色的類,然後用具體的圖形類去多繼承。
讓我們看看這個表述圖:
錯綜複雜的線看上去可能有些亂,但是我想大家應該都明白這個意思。
理解倒是容易理解了,可是這個時候我們再來看一下這個類的數量:
顏色12+顏色父類1+圖形18+圖形父類1+12*18,這個數字似乎比我們之前的那個數字還要大。
也許我會為他辯駁說他犧牲了空間而換取了可讀性,
橋接模式
這個時候讓我們來計算一下類的總數:
12個顏色類+18個圖形類+1個我們的圖形=31個類
class IColor { }
class RedColor : IColor { }
class BlueColor : IColor { }
class YellowColor : IColor { }
class IGraphics { }
class Rectangle:IGraphics { }
class Star:IGraphics { }
class Round : IGraphics { }
class PhotoShop
{
IColor color;
IGraphics graphics;
public PhotoShop(IColor c, IGraphics g)
{
this.color = c;
this.graphics = g;
}
public void Draw()
{
cout << color.GetType() <<endl;
cout << graphics.GetType() <<endl;
}
}
橋接模式(Bridge pattrern):將抽象部分與實現部分向分離,使他們都可以獨立變化。
引深:
1.介面是行為的契約,而抽象類別是特徵的抽象。一個是can do,一個是is a。
2.物件導向設計原則說:組合優於繼承。
上面的代碼,如果不僅僅要求顏色和形狀,還要求更多,那麼我就要寫很多很多的屬性,好麻煩。
而且更重要的是,如果有這樣的需求,我現在有12種顏色,然後有3種形狀,分別是方形,圓形和星星,有兩種筆,分別是鉛筆和蠟筆。但是我現在鉛筆只對應方形和星星,蠟筆只對應圓形和星星。也就是說不存在圓形鉛筆和方形蠟筆。這樣的話我的組合不是浪費了嗎?而且客戶很可能組合錯呀?
是的,不要一味去考慮組合。再重複一次我很愛說的話:模式是為了變化,不要為了模式而模式,我們只需要抽離出變化點就可以了!
如果這樣,那我們就寫好穩定的部門