<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 功能強大 支持多語言、二開方便! 廣告
                17.2 裝飾模式的定義 裝飾模式(Decorator Pattern)是一種比較常見的模式,其定義如下:Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾模式相比生成子類更為靈活。) 裝飾模式的通用類圖如圖17-5所示。 ![](https://box.kancloud.cn/2016-08-14_57b003657f6de.jpg) 圖17-5 裝飾模式的通用類圖 在類圖中,有四個角色需要說明: ● Component抽象構件 Component是一個接口或者是抽象類,就是定義我們最核心的對象,也就是最原始的對象,如上面的成績單。 注意 在裝飾模式中,必然有一個最基本、最核心、最原始的接口或抽象類充當Component抽象構件。 ● ConcreteComponent 具體構件 ConcreteComponent是最核心、最原始、最基本的接口或抽象類的實現,你要裝飾的就是它。 ● Decorator裝飾角色 一般是一個抽象類,做什么用呢?實現接口或者抽象方法,它里面可不一定有抽象的方法呀,在它的屬性里必然有一個private變量指向Component抽象構件。 ● 具體裝飾角色 ConcreteDecoratorA和ConcreteDecoratorB是兩個具體的裝飾類,你要把你最核心的、最原始的、最基本的東西裝飾成其他東西,上面的例子就是把一個比較平庸的成績單裝飾成家長認可的成績單。 裝飾模式的所有角色都已經解釋完畢,我們來看看如何實現,先看抽象構件,如代碼清單17-10所示。 代碼清單17-10 抽象構件 public?abstract?class?Component?{ ?????//抽象的方法 ?????public?abstract?void?operate(); } 具體構件如代碼清單17-11所示。 代碼清單17-11 具體構件 public?class?ConcreteComponent?extends?Component?{ ?????//具體實現 ?????@Override ?????public?void?operate()?{ ?????????????System.out.println("do?Something"); ?????} } 裝飾角色通常是一個抽象類,如代碼清單17-12所示。 代碼清單17-12 抽象裝飾者 public?abstract?class?Decorator?extends?Component?{ ?????private?Component?component?=?null;???????? ?????//通過構造函數傳遞被修飾者 ?????public?Decorator(Component?_component){ ?????????????this.component?=?_component; ?????} ?????//委托給被修飾者執行 ?????@Override ?????public?void?operate()?{ ?????????????this.component.operate(); ?????} } 當然了,若只有一個裝飾類,則可以沒有抽象裝飾角色,直接實現具體的裝飾角色即可。具體的裝飾類如代碼清單17-13所示。 代碼清單17-13 具體的裝飾類 public?class?ConcreteDecorator1?extends?Decorator?{ ?????//定義被修飾者 ?????public?ConcreteDecorator1(Component?_component){ ?????????????super(_component); ?????} ?????//定義自己的修飾方法 ?????private?void?method1(){ ?????????????System.out.println("method1?修飾"); ?????} ?????//重寫父類的Operation方法 ?????public?void?operate(){ ?????????????this.method1(); ?????????????super.operate(); ?????} } public?class?ConcreteDecorator2?extends?Decorator?{ ?????//定義被修飾者 ?????public?ConcreteDecorator2(Component?_component){ ?????????????super(_component); ?????} ?????//定義自己的修飾方法 ?????private?void?method2(){ ?????????????System.out.println("method2修飾"); ?????} ?????//重寫父類的Operation方法 ?????public?void?operate(){ ?????????????super.operate(); ?????????????this.method2(); ?????} } 注意 原始方法和裝飾方法的執行順序在具體的裝飾類是固定的,可以通過方法重載實現多種執行順序。 我們通過Client類來模擬高層模塊的耦合關系,看看裝飾模式是如何運行的,如代碼清單17-14所示。 代碼清單17-14 場景類 public?class?Client?{ ?????public?static?void?main(String[]?args)?{ ?????????????Component?component?=?new?ConcreteComponent(); ?????????????//第一次修飾 ?????????????component?=?new?ConcreteDecorator1(component); ?????????????//第二次修飾 ?????????????component?=?new?ConcreteDecorator2(component); ?????????????//修飾后運行 ?????????????component.operate(); ?????} }
                  <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>

                              哎呀哎呀视频在线观看