<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國際加速解決方案。 廣告
                # 擴展系統功能——裝飾模式(三) 12.3 完整解決方案 為了讓系統具有更好的靈活性和可擴展性,克服繼承復用所帶來的問題,Sunny公司開發人員使用裝飾模式來重構圖形界面構件庫的設計,其中部分類的基本結構如圖12-4所示: ![](http://my.csdn.net/uploads/201204/04/1333528353_8435.gif) 圖12-4 圖形界面構件庫結構圖 在圖12-4中,Component充當抽象構件類,其子類Window、TextBox、ListBox充當具體構件類,Component類的另一個子類ComponentDecorator充當抽象裝飾類,ComponentDecorator的子類ScrollBarDecorator和BlackBorderDecorator充當具體裝飾類。完整代碼如下所示: ``` //抽象界面構件類:抽象構件類,為了突出與模式相關的核心代碼,對原有控件代碼進行了大量的簡化 abstract class Component { public abstract void display(); } //窗體類:具體構件類 class Window extends Component { public void display() { System.out.println("顯示窗體!"); } } //文本框類:具體構件類 class TextBox extends Component { public void display() { System.out.println("顯示文本框!"); } } //列表框類:具體構件類 class ListBox extends Component { public void display() { System.out.println("顯示列表框!"); } } //構件裝飾類:抽象裝飾類 class ComponentDecorator extends Component { private Component component; //維持對抽象構件類型對象的引用 public ComponentDecorator(Component component) //注入抽象構件類型的對象 { this.component = component; } public void display() { component.display(); } } //滾動條裝飾類:具體裝飾類 class ScrollBarDecorator extends ComponentDecorator { public ScrollBarDecorator(Component component) { super(component); } public void display() { this.setScrollBar(); super.display(); } public void setScrollBar() { System.out.println("為構件增加滾動條!"); } } //黑色邊框裝飾類:具體裝飾類 class BlackBorderDecorator extends ComponentDecorator { public BlackBorderDecorator(Component component) { super(component); } public void display() { this.setBlackBorder(); super.display(); } public void setBlackBorder() { System.out.println("為構件增加黑色邊框!"); } } ``` 編寫如下客戶端測試代碼: ``` class Client { public static void main(String args[]) { Component component,componentSB; //使用抽象構件定義 component = new Window(); //定義具體構件 componentSB = new ScrollBarDecorator(component); //定義裝飾后的構件 componentSB.display(); } } ``` 編譯并運行程序,輸出結果如下: ``` 為構件增加滾動條! 顯示窗體! ``` 在客戶端代碼中,我們先定義了一個Window類型的具體構件對象component,然后將component作為構造函數的參數注入到具體裝飾類ScrollBarDecorator中,得到一個裝飾之后對象componentSB,再調用componentSB的display()方法后將得到一個有滾動條的窗體。如果我們希望得到一個既有滾動條又有黑色邊框的窗體,不需要對原有類庫進行任何修改,只需將客戶端代碼修改為如下所示: ``` class Client { public static void main(String args[]) { Component component,componentSB,componentBB; //全部使用抽象構件定義 component = new Window(); componentSB = new ScrollBarDecorator(component); componentBB = new BlackBorderDecorator(componentSB); //將裝飾了一次之后的對象繼續注入到另一個裝飾類中,進行第二次裝飾 componentBB.display(); } } ``` 編譯并運行程序,輸出結果如下: ``` 為構件增加黑色邊框! 為構件增加滾動條! 顯示窗體! ``` 我們可以將裝飾了一次之后的componentSB對象注入另一個裝飾類BlackBorderDecorator中實現第二次裝飾,得到一個經過兩次裝飾的對象componentBB,再調用componentBB的display()方法即可得到一個既有滾動條又有黑色邊框的窗體。 如果需要在原有系統中增加一個新的具體構件類或者新的具體裝飾類,無須修改現有類庫代碼,只需將它們分別作為抽象構件類或者抽象裝飾類的子類即可。與圖12-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>

                              哎呀哎呀视频在线观看