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

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

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

    細(xì)心!用心!耐心!

    吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學(xué)業(yè),五六點(diǎn)粗墨,七八筆買賣,九十道人情。

    BlogJava 聯(lián)系 聚合 管理
      1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
    在Java Swing中的JTextArea元件預(yù)設(shè)並沒有捲軸,因?yàn)樵O(shè)計(jì)人員認(rèn)為捲軸的功能並不是一定需要的,而決定讓程式人員可以動態(tài)選擇是否增加捲軸功能,捲軸的功能是由JScrollPane元件提供,如果您要加入一個(gè)具有捲軸功能的JTextArea,您可以如下進(jìn)行設(shè)計(jì):
    JTextArea textArea = new JTextArea();
    JScrollPane scrollPane = new JScrollPane(textArea);
     
    JScrollPane對JTextArea即是個(gè)容器,而它對JFrame來說又是個(gè)元件,可以如下這般將之加入JFrame中:
    getContentPane().add(scrollPane);
     
    像這樣動態(tài)的為JTextArea加入功能的方法,我們可以使用Decorator模式來組織結(jié)構(gòu),您可以動態(tài)的為一個(gè)物件加入一些功能(像是為 JTextArea加上捲軸),而又不用修改JTextArea的功能。對JTextArea來說,JScrollPane就好像是一個(gè)捲軸外框,直接套在JTextArea上作裝飾,就好比您在照片上加上一個(gè)相框的意思。

    先以上面這個(gè)例子來說明Decorator模式的一個(gè)實(shí)例:
    Decorator

    如上圖所示的,無論是TextView或是Decorator類別,它們都是VisualComponent的一個(gè)子類,也就是說它們都是一個(gè)可視元件,而Decorator類又聚合了VisualComponent,所以又可以當(dāng)作TextView容器,ScrollDecorator類別實(shí)作了 Decorator類,它可能是這樣設(shè)計(jì)的:
    public abstract class Decorator extends VisualComponent {
        protected VisualComponent component;

        public Decorator(VisualComponent component) {
            this.component = component;
        }

        public void draw() {
            component.draw();
        }
    }

    public class ScrollDecorator extends Decorator {
        public ScrollDecorator(VisualComponent component) {
            super(component);
        }

        public void draw() {
            super.draw();
            scrollTo();
        }

        public void scrollTo() {
            // ....
        }
    }
     
    要將新功能套用至TextView上,可以這樣設(shè)計(jì):
    ScrollDecorator scrollDecorator =
                        new ScrollDecorator(new TextView());
     
    super.draw()會先呼叫component也就是TextView物件的draw()方法先繪製TextView,然後再進(jìn)行 ScrollPanel的scrollTo(),也就是捲動的方法。在圖中也表示了一個(gè)BorderDecorator,它可能是這樣設(shè)計(jì)的:
    public class BorderDecorator extends Decorator {
        public BorderDecorator(VisualComponent component) {
            super(component);
        }

        public void draw() {
            super.draw();
            drawBorder();
        }

        public void drawBorder() {
            // ....
        }
    }
     
    要將ScrollDecorator與BorderDecorator加至TextView上,我們可以這樣設(shè)計(jì):
    BorderDecorator borderDecorator =
             new BorderDecorator(
                   new ScrollDecorator(new TextView()));

    所以當(dāng)BorderDecorator調(diào)用draw()方法時(shí),它會先調(diào)用ScrollDecorator的draw()方法,而 ScrollDecorator的draw()方法又會先調(diào)用TextView的draw()方法,所以繪製的順序變成:
    TextDraw.draw();
    ScrollDecorator.scrollTo();
    BorderDecorator.drawBorder();

    下圖為物件之間的調(diào)用關(guān)係:
    Decorator

    Decorator模式的 UML 結(jié)構(gòu)圖如下所示:
    Decorator

    在Gof的書中指出另一個(gè)範(fàn)例,它設(shè)計(jì)一個(gè)Stream抽象類,而有一個(gè)StreamDecorator類,Stream的子類有處理記憶體串流的 MemoryStream與FileStream,有各種方法可以處理串流,也許只是單純的處理字元,也許會進(jìn)行壓縮,也許會進(jìn)行字元轉(zhuǎn)換,最基本的處理可能是處理字元,而字元壓縮被視為額外的功能,這個(gè)時(shí)候我們可以使用裝飾模式,在需要的時(shí)候?yàn)镾tream物件加上必要的功能,事實(shí)上在java.io中的許多輸入輸出物件,就是採取這樣的設(shè)計(jì)。
    posted on 2007-04-17 10:44 張金鵬 閱讀(342) 評論(0)  編輯  收藏 所屬分類: Structural 模式
    主站蜘蛛池模板: 精品国产呦系列在线观看免费| 亚洲精品福利视频| 黄页网址大全免费观看12网站| 国产精品美女午夜爽爽爽免费 | 国产精品V亚洲精品V日韩精品| 菠萝菠萝蜜在线免费视频| 国产一级高清视频免费看| 香港特级三A毛片免费观看| 免费永久看黄在线观看app| 免费人成大片在线观看播放| 亚洲免费一区二区| 国产精品免费久久久久久久久| 中文亚洲AV片不卡在线观看| 精品视频在线免费观看| 亚洲精品第五页中文字幕| 野花高清在线观看免费完整版中文| 亚洲中文字幕无码一去台湾| 免费无码一区二区三区蜜桃大| 国产成人综合亚洲绿色| 中文字幕亚洲专区| 亚洲人成免费电影| 亚洲av午夜国产精品无码中文字| 国产小视频在线免费| 一级做a爱过程免费视频高清| 久久亚洲国产中v天仙www| 91香蕉在线观看免费高清| 亚洲无人区码一二三码区别图片| 国产网站免费观看| 99精品免费视品| 亚洲短视频在线观看| 国产免费av片在线无码免费看| 亚洲免费无码在线| 亚洲精品第五页中文字幕| 免费乱理伦在线播放| 亚洲精品免费观看| 亚洲AV无码成人精品区狼人影院| 亚洲美女又黄又爽在线观看| 日韩在线免费视频| 成人一区二区免费视频| 亚洲影视一区二区| 日韩精品亚洲aⅴ在线影院|