2016-11-06 41 views
0

我已經實現使用JavaFX以下simplyfied結構:以下結構是否被視爲設計模式?

App.java

public void start(Stage primaryStage) { 
    MyConnector myconnector = new MyConnector(); 
    LeftPane leftPane = new LeftPane(myconnector); 
    RightPane rightPane = new RightPane(myconnector); 
} 

MyConnector.java

public class MyConnector { 
    private Button button;      // getters, setters 
    private Field field;       // getters, setters 
} 

LeftPane.java

public LeftPane extends FlowPane { 
    private Button button;      // getters, setters 
    private MyConnector myConnector;    // in constructor, getters, setters 

    public LeftPane(myConnector) { 
     this.button = new Button(); 
     this.myConnector = myConnector; 
     this.myConnector.setField(this.button); // add to the MyConnector 
    } 

    an event on action { 
     this.myConnector.getField().setEditable(false); 
     this.button.setDisable(true); 
    } 
} 

RightPane.java

public RightPane extends FlowPane { 
    private TextField field;      // getters, setters 
    private MyConnector myConnector;    // in constructor, getters, setters 

    public LeftPane(myConnector) { 
     this.field = new TextField(); 
     this.myConnector = myConnector; 
     this.myConnector.setField(this.field); // add to the MyConnector 
    } 

    an event on action { 
     this.myConnector.getButton().setDisable(true); 
     this.field.setEditable(false); 
    } 
} 

不久它意味着,我有一個包含第一個的Button和第二個中的TextField兩個窗格。在某些事件觸發器上,我想一次禁用它們。此解決方案完美運作。

我想首先避免這種交叉狀的代碼,導致只有NullPointerException

LeftPane leftPane = new LeftPane(this.rightPane.getField()); 
RightPane rightPane = new RightPane(this.leftPane.getButton()); 

是結構上面我已經使用了正確的做法,是其公認的設計模式之一?如果是這樣,它的名字是什麼?我一直在想AdapterBridge,但我無法將我的結構重構爲其中之一。

如果我的結構根本不是設計模式,是否存在一個處理同樣的事情?還是存在更好的方法?

+0

看起來就像物體組成,不一定模式 –

+0

如果你通過一些解釋,比較或建議將你的評論變成一個答案,那將是可以接受的。 :)) –

+0

雖然它可能是一種模式。 https://sourcemaking.com/design_patterns/structural_patterns –

回答

3

我很確定這不是一種設計模式。設計模式是良好設計的例子(至少在具體問題方面)。你所做的一切肯定是不好的設計:

  • 你硬編碼MyConnector類的字段; MyConnector只適用於Button/TextField組合;您不能添加2個以上的元素或不同的元素,而無需重寫類MyConnector。這也限制了可重用性。
  • 這個更糟:你在LeftPaneRightPane之間有很高的耦合度。您從另一個窗格中取消激活另一個窗格的UI的訪問其他窗格的內部。假設您想添加矩形到LeftPane,如果窗格處於活動/禁用狀態,則填充綠色/紅色。在這種情況下,您需要修改RightPane的代碼以便爲您執行此操作。

在這種情況下這將是合適的是使用觀察者模式。這允許您添加元素的任意號碼,沒有元素需要了解對方的內部:

BooleanProperty connector = new SimpleBooleanProperty(); 
LeftPane leftPane = new LeftPane(connector); 
RightPane rightPane = new RightPane(connector); 
public LeftPane extends FlowPane { 
    private Button button; 
    private BooleanProperty myConnector; 

    public LeftPane(myConnector) { 
     this.button = new Button(); 
     this.myConnector = myConnector; 
     ChangeListener<Boolean> listener = (observable, oldValue, newValue) -> { 
      this.button.setDisable(newValue); 
     }; 
     myConnector.addListener(listener); 
     listener.changed(null, null, myConnector.get()); 
    } 

    an event on action { 
     this.myConnector.set(false); 
    } 
} 
public RightPane extends FlowPane { 
    private TextField field; 
    private BooleanProperty myConnector; 

    public LeftPane(myConnector) { 
     this.field = new TextField(); 
     this.myConnector = myConnector; 
     ChangeListener<Boolean> listener = (observable, oldValue, newValue) -> { 
      // update this UI part 
      this.field.setEditable(newValue); 
     }; 
     myConnector.addListener(listener); 
     listener.changed(null, null, myConnector.get()); 
    } 

    an event on action { 
     this.myConnector.set(false); 
    } 
} 
+0

那麼,有一些設計模式('反模式')是故意設計不好的例子... – EJP

+0

好的答案,謝謝:)) –

相關問題