<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                定義:動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。 類型:結構型模式。 類圖: ![](https://box.kancloud.cn/2016-08-19_57b6b46621286.png) 參入者: 1. Component,抽象類,只是提供接口。 1. Model,一個具體對象,實現接口完成一些基本的功能。 1. Decorator,有一個指向Component的指針,并且實現了Componet的接口。 1. Hairtician,Costumer,都是具體的裝飾者,首先在實現基本的接口下,添加了新的功能。 適用性: 1. 裝飾模式其應用體現在裝飾上。那些需要動態添加同類型功能的產品,都可以使用裝飾模式。 1. 以添加新類的方式來給單個對象添加新裝飾。 1. 當不能以子類的方式擴展時,可以使用裝飾模式來擴展。 概述: ?????????裝飾者模式是一種結構模式,表明裝飾者模式主要是通過更改類的結構關系來實現的。Decorator與Model保持相同的接口,主要是為了保證操作Hairtician和Costumer時保持和操作Model時一樣的體驗。理論上來說,Decorator和Model不保持一樣的接口,重新定義接口也是可以的。這里的裝飾是一種鏈式的,即每一種新添加的裝飾都是在之前的基本上生成新的類來完成的。新類在完成新添加的裝飾之后,然后將接下來的動作返還到上一個裝飾者。依次這樣,達到鏈式完成裝飾的功能。因為保持接口一致,在客戶看來,其實是一致的,不影響客戶的調用及體驗。 示例代碼: ~~~ // C# namespace?Design10 { ???class?Component ???{ ???????public?virtual?void?MakeUp()?{?} ???} ???class?Model?:?Component ???{ ???????public?override?void?MakeUp() ???????{ ???????????Console.WriteLine("模特自己完成基本的裝扮"); ???????} ???} ???abstract?class?Decorator?:?Component ???{ ???????protected?Component?component; ???????public?void?SetComponent(Component?component) ???????{ ???????????this.component?=?component; ???????} ???????public?override?void?MakeUp() ???????{ ???????????if?(component?!=?null) ???????????{ ???????????????component.MakeUp(); ???????????} ???????} ???} ???class?Hairtician?:?Decorator ???{ ???????public?override?void?MakeUp() ???????{ ???????????base.MakeUp(); ???????????Console.WriteLine("做新的發型"); ???????} ???} ???class?Costumer?:?Decorator ???{ ???????public?override?void?MakeUp() ???????{ ???????????base.MakeUp(); ???????????AddedBehavior(); ???????} ???????private?void?AddedBehavior() ???????{ ???????????Console.WriteLine("穿個性化的裙子"); ???????} ???} ???class?Program ???{ ???????static?void?Main(string[]?args) ???????{ ???????????Model?model?=?new?Model(); ???????????Decorator?decorator1?=?new?Hairtician(); ???????????Decorator?decorator2?=?new?Costumer(); ???????????decorator1.SetComponent(model); ???????????decorator2.SetComponent(decorator1); ???????????decorator2.MakeUp(); ???????} ???} } ~~~ 與其他模式比較:裝飾者模式其實與組合模式有一些類似的地方。都是通過組合的方法來實現添加新的模塊。只是裝飾者模式將產品獨立出來,抽象出來裝飾這個動作。而組合模式沒有將產品與動作分開,組合模式的鏈條可以是像裝飾者模式模式那樣單一鏈條,也可是樹形的,分出多個分支。 注意: 1. 如果是C++代碼需要注意抽象類的析構函數必須是虛函數,否則釋放內存的時候會出現問題。 1. C#,Java的時候,最開始的接口類不能改為接口,這樣多態在經過多次繼承之后會出現問題。 優缺點: 1. 優點,動態添加新功能,能夠組合不同的功能,并且保證接口的一致。 1. 缺點,如果添加的功能過多,會增加過多的類,增加程序復雜度。 參考資料: 1. 《設計模式——可復用面向對象軟件基礎》 1. 《Java與模式》 1. 《大話設計模式》 1. 《Head?First設計模式》
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看