設計模式之橋接模式(Bridge)之一(Photoshop樣本) 結構型模式

來源:互聯網
上載者:User

 

舉個我們最常用的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種形狀,分別是方形,圓形和星星,有兩種筆,分別是鉛筆和蠟筆。但是我現在鉛筆只對應方形和星星,蠟筆只對應圓形和星星。也就是說不存在圓形鉛筆和方形蠟筆。這樣的話我的組合不是浪費了嗎?而且客戶很可能組合錯呀?

 

是的,不要一味去考慮組合。再重複一次我很愛說的話:模式是為了變化,不要為了模式而模式,我們只需要抽離出變化點就可以了!

如果這樣,那我們就寫好穩定的部門

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.