<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                裝飾者(Decorator)模式:動態地將責任附加到對象上,若要擴展功能,裝飾者提供了比繼承更具有彈性的替代方案。對于裝飾者模式,它其實是一種包裝,所以我更愿意稱它為一種包裝。像咱們以前經常使用的Java里面的IO流就用到了裝飾者模式。比如:BufferedReader?br = new BufferedReader(new InputStreamReader(new FileInputStream(file1)));這里file1為目標對象,而像BufferedReader、InputStreamReader就可以稱之為包裝類。下面舉例說明: ## 一、UML模型圖 ![](https://box.kancloud.cn/2016-02-19_56c7196d143cb.jpg) ## 二、代碼實現 ~~~ /** * 對修改關閉,對擴展開放。 * * 統一接口 */ interface Filterable { public void filter(); } /** * 目標類 */ class Filter implements Filterable { @Override public void filter() { System.out.println("目標類的核心過濾方法..."); } } /** * DecoratorForFilter1包裝類與目標類實現相同的接口 --> 織入Log */ class DecoratorForFilter1 implements Filterable { private Filterable filterable; public DecoratorForFilter1(Filterable filterable) { this.filterable = filterable; } private void beforeMethod() { System.out.println("DecoratorForFilter1 --> 核心過濾方法執行前執行"); } private void afterMethod() { System.out.println("DecoratorForFilter1 --> 核心過濾方法執行后執行"); } @Override public void filter() { beforeMethod(); filterable.filter(); afterMethod(); } } /** * DecoratorForFilter2包裝類與目標類實現相同的接口 --> 織入Log */ class DecoratorForFilter2 implements Filterable { private Filterable filterable; public DecoratorForFilter2(Filterable filterable) { this.filterable = filterable; } private void beforeMethod() { System.out.println("DecoratorForFilter2 --> 核心過濾方法執行前執行"); } private void afterMethod() { System.out.println("DecoratorForFilter2 --> 核心過濾方法執行后執行"); } @Override public void filter() { beforeMethod(); filterable.filter(); afterMethod(); } } /** * 客戶端測試類 * * @author Leo */ public class Test { public static void main(String[] args) { /** * 目標對象 */ Filterable targetObj = new Filter(); /** * 包裝對象(對目標對象進行包裝) */ Filterable decorObj = new DecoratorForFilter1(new DecoratorForFilter2( targetObj)); /** * 執行包裝后的業務方法 */ decorObj.filter(); } } ~~~ 輸出: DecoratorForFilter1 --> 核心過濾方法執行前執行 DecoratorForFilter2 --> 核心過濾方法執行前執行 目標類的核心過濾方法... DecoratorForFilter2 --> 核心過濾方法執行后執行 DecoratorForFilter1 --> 核心過濾方法執行后執行 ## 三、應用場景(僅代表個人觀點) I/O、過濾器 ## 四、小結 通過輸入的Log我們可以看到:輸出的過程其實是將包裝類“拆包”的過程,就像包裝袋一樣一層一層的拆開。 設計原則:1)多用組合,少用繼承。2)對擴展開放,對修改關閉。
                  <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>

                              哎呀哎呀视频在线观看