以下结构是否被视为设计模式?

时间:2016-11-06 21:01:48

标签: java design-patterns javafx structure

我使用JavaFX实现了以下简单的结构:

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,但我无法将我的结构重构为其中一个。

如果我的结构根本不是设计模式,是否存在处理同一事物的模式?还是有更好的方法?

1 个答案:

答案 0 :(得分:3)

我很确定这不是一种设计模式。设计模式是良好设计的例子(至少就特定问题而言)。你所做的绝不是好设计:

  • 您对MyConnector课程中的字段进行了硬编码; MyConnector仅适用于Button / TextField组合;如果不重写MyConnector类,则不能添加2个以上的元素或不同的元素。这也限制了可重复使用性。
  • 这个更糟糕:你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);
    } 
}