2016-11-06 71 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

好的答案,谢谢:)) –

相关问题