2016-11-06 6 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 2つ目TextFieldを含む2つのペインを有することを意味します。いくつかのイベントのトリガで、私はすぐにそれらの両方を無効にしたい。このソリューションは完全に機能します。

私はまずのみNullPointerExceptionにつながり、このクロスのようなコードを、避ける募集:私は正しいアプローチを使用しているし、それが認識デザインパターンの一つである上

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

は、構造ですか?もしそうなら、その名前は何ですか?私はAdapterまたはBridgeを考えていますが、私の構造をそれらの1つにリファクタリングすることはできません。

私の構造が全くデザインパターンでない場合、同じものを扱うものは存在しますか?またはより良いアプローチが存在するか?

+0

ジャストパターン必ずしも、オブジェクト構成のように見えます –

+0

あなたのコメントをいくつかの説明、比較、提案と共に答えに変えれば、それは受け入れられるだろう。 :)) –

+0

しかし、それはパターンかもしれません。 https://sourcemaking.com/design_patterns/structural_patterns –

答えて

3

私はこれがデザインパターンではないと確信しています。デザインパターンは、(少なくとも特定の問題に関して)良いデザインの例です。あなたがしたことは間違いなく良いデザインです:

  • MyConnectorクラスのフィールドをハードコードしています。 MyConnectorButton/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); 
    } 
} 
+0

まあ、悪いデザインの意図的なインスタンスであるいくつかのデザインパターン( 'アンチパターン')があります... – EJP

+0

いい回答、ありがとう:)) –

関連する問題