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

          吾非文人,乃市井一俗人也,讀百卷書(shū),跨江河千里,故申城一游; 一兩滴辛酸,三四年學(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....");
          }
          }

          很簡(jiǎn)單,這是最基本的介面依賴,Setter依賴於IButton與ITextField兩個(gè)介面,而不是其實(shí)作類別,不過(guò)這邊還有個(gè)進(jìn)一步的要求,使用上面的方式還必須親自呼叫Setter、layout等方法,您希望視感的更換可以更簡(jiǎn)單些,例如只要透一個(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();

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

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

          // 由於客戶端只依賴於抽象的工廠,工廠如何實(shí)作並無(wú)關(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

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

          posted on 2007-04-16 17:41 張金鵬 閱讀(260) 評(píng)論(0)  編輯  收藏 所屬分類: Creational 模式
          主站蜘蛛池模板: 平和县| 吉林省| 大渡口区| 龙里县| 团风县| 咸阳市| 芮城县| 柘荣县| 三门峡市| 平定县| 乌兰察布市| 洛扎县| 星座| 疏附县| 浏阳市| 巫山县| 江安县| 偃师市| 南平市| 徐水县| 中西区| 马关县| 石门县| 额济纳旗| 杂多县| 台山市| 通河县| 叶城县| 伊川县| 永宁县| 平潭县| 曲水县| 沅陵县| 萨嘎县| 门头沟区| 莆田市| 太湖县| 德兴市| 南康市| 逊克县| 北安市|