<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
    假設(shè)您要製作一個(gè)對(duì)話方塊(Dialog)元件,您希望的是這個(gè)對(duì)話方塊可以有不同的視感(Look-and- feel),最基本的想法是,藉由Setter將不同視感的元件設(shè)定給這個(gè)對(duì)話方塊,例如:
    • CustomDialog.java
    public class CustomDialog {
    private IButton button;
    private ITextField textField;

    public void setButton(IButton button) {
    this.button = button;
    }

    public void setTextField(ITextField textField) {
    this.textField = textField;
    }

    public void layoutAllComponents() {
    // ....
    }

    public void showDialog() {
    this.paintDialog();
    button.paintButton();
    textField.paintTextField();
    }

    public void paintDialog() {
    System.out.println("custom dialog paints....");
    }
    }

    很簡單,這是最基本的介面依賴,Setter依賴於IButton與ITextField兩個(gè)介面,而不是其實(shí)作類別,不過這邊還有個(gè)進(jìn)一步的要求,使用上面的方式還必須親自呼叫Setter、layout等方法,您希望視感的更換可以更簡單些,例如只要透一個(gè)元件的替換就可以完成對(duì)話方塊上所有元件的視感更換。

    您可以使用Abstract Factory模式,將所有對(duì)話方塊所需要的產(chǎn)生的元件加以封裝,對(duì)話方塊依賴於Abstract Factory,實(shí)際上具體的Factory實(shí)現(xiàn)則分別產(chǎn)生對(duì)話方塊所需要的視感元件,下面的 UML 類別圖展現(xiàn)這種概念。
    AbstractFactory

    現(xiàn)在如果要更換所有的視感元件,就只要抽象掉具體的Factory就可以了,例如:
    CustomDialog windowsDialog =
          new CustomDialog(new WindowsWidgetFactory());
    windowsDialog.showDialog();
                   
    CustomDialog macDialog =
          new CustomDialog(new MacWidgetFactory());
    macDialog.showDialog();

    來將上面的UML圖具體實(shí)現(xiàn)出來。
    • CustomDialog.java
    public class CustomDialog {
    private IButton button;
    private ITextField textField;

    public CustomDialog(IWidgetFactory widgetFactory) {
    setWidgetFactory(widgetFactory);
    }

    // 由於客戶端只依賴於抽象的工廠,工廠如何實(shí)作並無關(guān)客戶端的事
    // 要抽換工廠並不需要改動(dòng)客戶端的程式
    public void setWidgetFactory(IWidgetFactory widgetFactory) {
    setButton(widgetFactory.getButton());
    setTextField(widgetFactory.getTextField());

    }

    public void layoutAllComponents() {
    // layout all components
    }

    // 這邊也是依賴抽象,實(shí)際改變了元件實(shí)例
    // 客戶端代碼也不用更改
    public void setButton(IButton button) {
    this.button = button;
    }

    public void setTextField(ITextField textField) {
    this.textField = textField;
    }

    public void showDialog() {
    this.paintDialog();
    button.paintButton();
    textField.paintTextField();
    }

    public void paintDialog() {
    System.out.println("custom dialog paints....");
    }
    }

    • IButton.java
    public interface IButton {
    public void paintButton();
    }

    • ITextField.java
    public interface ITextField {
    public void paintTextField();
    }

    • IWidgetFactory.java
    public interface IWidgetFactory {
    public IButton getButton();
    public ITextField getTextField();
    }

    • MacButton.java
    public class MacButton implements IButton {
    public void paintButton() {
    System.out.println("Mac button paints....");
    }
    }

    • WindowsButton.java
    public class WindowsButton implements IButton {
    public void paintButton() {
    System.out.println("Windows button paints....");
    }
    }

    • MacTextField.java
    public class MacTextField implements ITextField {
    public void paintTextField() {
    System.out.println("Mac textField paints....");
    }
    }

    • WindowsTextField.java
    public class WindowsTextField implements ITextField {
    public void paintTextField() {
    System.out.println("Windows textField paints....");
    }
    }

    • MacWidgetFactory.java
    public class MacWidgetFactory implements IWidgetFactory {
    public IButton getButton() {
    return new MacButton();
    }

    public ITextField getTextField() {
    return new MacTextField();
    }
    }

    • WindowsWidgetFactory.java
    public class WindowsWidgetFactory 
    implements IWidgetFactory {
    public IButton getButton() {
    return new WindowsButton();
    }

    public ITextField getTextField() {
    return new WindowsTextField();
    }
    }

    下圖是Abstract Factory模式的UML結(jié)構(gòu)圖:
    AbstractFactory

    簡單的說,在Abstract Factory模式中將具體的Product封裝在具體Factory實(shí)現(xiàn)中,而客戶仍只要面對(duì)Factory與Product的抽象介面,避免依賴於具體的Factory與Product,由於Factory封裝了所必須的Product,所以要更換掉所有的元件,只要簡單的抽換掉Factory就可以了,不用修改客戶端的程式。

    posted on 2007-04-16 17:41 張金鵬 閱讀(253) 評(píng)論(0)  編輯  收藏 所屬分類: Creational 模式
    主站蜘蛛池模板: 免费观看a级毛片| 中文字幕影片免费在线观看| 四虎精品亚洲一区二区三区| 亚洲人xxx日本人18| 免费不卡视频一卡二卡| 亚洲最大的黄色网| 性色av无码免费一区二区三区| 激情综合亚洲色婷婷五月APP| 波多野结衣中文字幕免费视频| 亚洲日韩中文字幕| 无码国产精品久久一区免费| 亚洲午夜无码久久| 男人的天堂亚洲一区二区三区 | 韩国日本好看电影免费看| 亚洲性无码一区二区三区| 国产片免费福利片永久| 羞羞视频免费网站日本| 亚洲精品少妇30p| 国产精品久久久久久久久免费| 亚洲一区二区三区乱码在线欧洲| 精品免费国产一区二区三区| 美女羞羞免费视频网站| 中文字幕亚洲无线码| 777成影片免费观看| 亚洲中文字幕久久精品无码VA| 国产成人免费ā片在线观看| 国产精品小视频免费无限app | 精品一区二区三区免费| 91亚洲导航深夜福利| 女人让男人免费桶爽30分钟| 2022国内精品免费福利视频 | 亚洲丰满熟女一区二区哦| 亚洲成年人啊啊aa在线观看| 久久99免费视频| 亚洲日韩国产AV无码无码精品| 亚洲成?v人片天堂网无码| 无码精品一区二区三区免费视频| 国产亚洲精品成人AA片| 亚洲精品字幕在线观看| 最新仑乱免费视频| 日韩精品无码免费专区午夜|