<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Swing


    天行健 君子以自強不息

    posts - 69, comments - 215, trackbacks - 0, articles - 16
       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    設計模式:結構模式之Decorator(油漆工)

    Posted on 2007-06-04 15:09 zht 閱讀(351) 評論(0)  編輯  收藏 所屬分類: 設計模式

    Decorator定義:
    動態給一個對象添加一些額外的職責,就象在墻上刷油漆.使用Decorator模式相比用生成子類方式達到功能的擴充顯得更為靈活.

    為什么使用Decorator?
    我們通??梢允褂美^承來實現功能的拓展,如果這些需要拓展的功能的種類很繁多,那么勢必生成很多子類,增加系統的復雜性,同時,使用繼承實現功能拓展,我們必須可預見這些拓展功能,這些功能是編譯時就確定了,是靜態的.

    使用Decorator的理由是:這些功能需要由用戶動態決定加入的方式和時機.Decorator提供了"即插即用"的方法,在運行期間決定何時增加何種功能.

    程序舉例:
    Display.java:
    public abstract class Display {
     public abstract int getColumns(); // 取得橫向的字數

     public abstract int getRows(); // 取得直向的行數

     public abstract String getRowText(int row); // 取得第row個字串

     public final void show() { // 打印所有內容
      for (int i = 0; i < getRows(); i++) {
       System.out.println(getRowText(i));
      }
     }
    }
    Border .java:
    public abstract class Border extends Display {
        protected Display display;          // 指裝飾外框里面的「內容」??
        protected Border(Display display) { // 在產生對象實例時,以參數指定「內容」
            this.display = display;
        }
    }

    StringDisplay .java:
    public class StringDisplay extends Display {
     private String string; // 打印的字串

     public StringDisplay(String string) { // 以參數指定打印的字串
      this.string = string;
     }

     public int getColumns() { // 字數
      return string.getBytes().length;
     }

     public int getRows() { // 行數為1
      return 1;
     }

     public String getRowText(int row) { // 僅在row為0時才返回
      if (row == 0) {
       return string;
      } else {
       return null;
      }
     }
    }

    SideBorder.java:
    public class SideBorder extends Border {
     private char borderChar; // 裝飾字符

     public SideBorder(Display display, char ch) { // 以構造子指定Display和裝飾字符
      super(display);
      this.borderChar = ch;
     }

     public int getColumns() { // 字數要再加上內容兩邊的裝飾字符
      return 1 + display.getColumns() + 1;
     }

     public int getRows() { // 行數同內容的行數
      return display.getRows();
     }

     public String getRowText(int row) { // 指定該行的內容即為在內容之指定行的兩邊
      // 加上裝飾字符

      return borderChar + display.getRowText(row) + borderChar;
     }
    }

    UpDownBorder .java:
    public class UpDownBorder extends Border {
     private char borderChar; // 裝飾字符

     public UpDownBorder(Display display, char ch) { // 以構造子指定Display和裝飾字符
      super(display);
      this.borderChar = ch;
     }

     public int getColumns() { // 字數同內容的字數
      return display.getColumns();
     }

     public int getRows() { // 行數要再加上內容上下的裝飾字符的行數
      return 1 + display.getRows() + 1;
     }

     public String getRowText(int row) { // 指定該行的內容
      if (row == 0 || row == getRows() - 1) {
       return makeLine(borderChar, getColumns());
      } else {
       return display.getRowText(row - 1);
      }
     }

     private String makeLine(char ch, int count) { // 以字符ch,建立重復count次的連續字串
      StringBuffer buf = new StringBuffer();
      for (int i = 0; i < count; i++) {
       buf.append(ch);
      }
      return buf.toString();
     }
    }


    Main.java:
    public class Main {
        public static void main(String[] args) {
            Display b1 = new StringDisplay("Hello, world.");
            Display b2 = new UpDownBorder(b1, '-');
            Display b3 = new SideBorder(b2, '*');
            b1.show();
            b2.show();
            b3.show();
            Display b4 =
                        new FullBorder(
                            new UpDownBorder(
                                new SideBorder(
                                    new UpDownBorder(
                                        new SideBorder(
                                            new StringDisplay("您好。"),
                                            '*'
                                        ),
                                        '='
                                    ),
                                    '|'
                                ),
                                '/'
                            )
                        );
            b4.show();
        }
    }

    注意:display繼承類中的getRowText方法
    這個方法把所有的用法都繼集成到一起
    主站蜘蛛池模板: 国色精品va在线观看免费视频| 特级做A爰片毛片免费69| 热99re久久精品精品免费| 亚洲小视频在线观看| 日本一区二区免费看| 亚洲AV无码国产精品麻豆天美 | 在线a人片天堂免费观看高清| 亚洲午夜在线一区| 成人黄色免费网址| 亚洲午夜电影在线观看| 一个人看的www在线观看免费| 久久亚洲国产成人影院| 日韩一区二区在线免费观看| 鲁啊鲁在线视频免费播放| 国产亚洲美女精品久久久| 成全视频免费观看在线看| 久久亚洲精品成人av无码网站| 69av免费视频| 亚洲中文字幕一二三四区| 四虎影视在线永久免费观看| 无码人妻一区二区三区免费视频 | 今天免费中文字幕视频| 亚洲欧洲日产国产综合网| 国产人在线成免费视频| 苍井空亚洲精品AA片在线播放| 亚洲午夜AV无码专区在线播放| a级成人毛片免费视频高清| 久久久久久亚洲精品成人| 成全视频在线观看免费高清动漫视频下载 | 亚洲色图国产精品| 免费看美女被靠到爽的视频| www永久免费视频| 亚洲第一网站免费视频| 国产成人免费网站在线观看| 99精品免费视品| 亚洲人成电影网站久久| 不卡精品国产_亚洲人成在线| 久久免费看黄a级毛片| 国产成人高清亚洲一区久久 | 亚洲精品国产摄像头| 九月丁香婷婷亚洲综合色|