Design Model---Decorator Model

來源:互聯網
上載者:User

標籤:des   blog   http   java   使用   2014   

學習的第二個設計模式,當你設計的類圖出現了類爆炸就應該考慮類的設計是否有問題,是否需要用裝飾模式來修改。先來看看裝飾模式的定義:(wiki)

通過使用修飾模式,可以在運行時擴充一個類的功能。原理是:增加一個修飾類包裹原來的類,包裹的方式一般是通過在將原來的對象作為修飾類的建構函式的參數。裝飾類實現新的功能,但是,在不需要用到新功能的地方,它可以直接調用原來的類中的方法。修飾類必須和原來的類有相同的介面。修飾模式是類繼承的另外一種選擇。類繼承在編譯時間候增加行為,而裝飾模式是在運行時增加行為。動態地去擴充一個類的功能,這是裝飾模式的優點,缺點是會產生很多小的修飾類,這會造成開發人員學習的困難,比如JAVA中的JDK的FileInputStream類族。

修飾模式有一個共同的抽象類別,這樣經過修飾的類和未被修飾的類就可以有共同的介面,所以引用介面不會變,這是修飾模式設計中需要注意的一點。

應用情境:星巴克開發的例子,一杯咖啡可以有好幾種的咖啡,A,B,C三類咖啡,那麼A,B,C這三個類可以有一個抽象類別作為基類Base。修飾類型也有很多種,那麼可不可以直接從Base類繼承而來呢??

      圖片摘自Head First Design Model

範例中是從Base類中派生出一個DecorateBase類來,所有的修飾類再從DecorateBase中派生出來。在DecorateBase類中把getDescription方法聲明為抽象方法。

這裡對設計模式的一個簡單複述:http://hiqianjin.com/blog/259

藉此,在java中隊抽象類別的聲明有兩種方法,一種是介面,一種是abstract class。

abstract本質上市"is-a"關係,interface本質上市“like-a"關係

abstract classs本質上是子類需要通過繼承的方式來實現,本質上子類和父類本質上市相同的,interface則是子類實現,可以有多個介面。

abstract class可以聲明變數,但是interface class不可以,如果需要聲明,那麼必須聲明為final static也就是這個變數需要

abstract class可以聲明為抽象方法,也可以不是抽象方法,可以有自己的類內實體,interface則不可以,只能聲明行數方法,不能有具體實現。()

可以說interface是abstract class的一個特例。關於interface和abstact class的異同可以我的收藏文章中查看。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.