裝飾器模式(Decorator Pattern)容許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式,它是做爲現有的類的一個包裝。這種模式建立了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。咱們經過下面的實例來演示裝飾器模式的用法。其中,咱們將把一個形狀裝飾上不一樣的顏色,同時又不改變形狀類。git
意圖:動態地給一個對象添加一些額外的職責。就增長功能來講,裝飾器模式相比生成子類更爲靈活。
主要解決:通常的,咱們爲了擴展一個類常常使用繼承方式實現,因爲繼承爲類引入靜態特徵,而且隨着擴展功能的增多,子類會很膨脹。
什麼時候使用:在不想增長不少子類的狀況下擴展類。
如何解決:將具體功能職責劃分,同時繼承裝飾者模式。
關鍵代碼: 一、Component 類充當抽象角色,不該該具體實現。 二、修飾類引用和繼承 Component 類,具體擴展類重寫父類方法。
應用實例: 一、孫悟空有 72 變,當他變成"廟宇"後,他的根本仍是一隻猴子,可是他又有了廟宇的功能。 二、不論一幅畫有沒有畫框均可以掛在牆上,可是一般都是有畫框的,而且其實是畫框被掛在牆上。在掛在牆上以前,畫能夠被蒙上玻璃,裝到框子裏;這時畫、玻璃和畫框造成了一個物體。
優勢:裝飾類和被裝飾類能夠獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式能夠動態擴展一個實現類的功能。
缺點:多層裝飾比較複雜。
使用場景: 一、擴展一個類的功能。 二、動態增長功能,動態撤銷。
注意事項:可代替繼承。github
咱們將建立一個 Shape 接口和實現了 Shape 接口的實體類。而後咱們建立一個實現了 Shape 接口的抽象裝飾類 ShapeDecorator,並把 Shape 對象做爲它的實例變量RedShapeDecorator 是實現了 ShapeDecorator 的實體類。DecoratorPatternDemo,咱們的演示類使用 RedShapeDecorator 來裝飾 Shape 對象。設計模式
具體代碼參見https://github.com/Hp1512/Lea...spa