我使用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());
上面的结构是否使用了正确的方法,是否是公认的设计模式之一?如果是这样,它的名字是什么?我一直在考虑Adapter
或Bridge
,但我无法将我的结构重构为其中一个。
如果我的结构根本不是设计模式,是否存在处理同一事物的模式?还是有更好的方法?
答案 0 :(得分:3)
我很确定这不是一种设计模式。设计模式是良好设计的例子(至少就特定问题而言)。你所做的绝不是好设计:
MyConnector
课程中的字段进行了硬编码; MyConnector
仅适用于Button
/ TextField
组合;如果不重写MyConnector
类,则不能添加2个以上的元素或不同的元素。这也限制了可重复使用性。LeftPane
和RightPane
之间的联系很高。您可以从另一个窗格访问另一个窗格的内部停用一个窗格的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);
}
}