8

コントローラをイベントリスナーとして登録する必要があるため、コントローラへの参照を保持するビューが必要です。ボタンをクリックすると、リスト内の選択したファイルを取得できる必要があるため、ビューへの参照を保持するコントローラーが必要です。(ファイルのリストと[クラスターの追加]ボタンがあるので、ボタンをクリックすると、選択したファイルを取得する必要があります)

要するに私は持っています:

Controller controller(view);
View view(controller);

ここには悪いデザインがあると思いますが、それを回避する方法がわかりません。

4

5 に答える 5

5

使用しているJavaテクノロジーはわかりませんが、GWTアプリケーション(およびMVPパターンを使用)では、ビューにコントローラーへの参照を含める必要はありません。コントローラー(またはプレゼンター)とビューの間のすべての通信ビューによって実装されたインターフェイスを介して作成されます。特定のケースでは、コードは次のようになります。

表示インターフェースを定義します。

public interface Display {
    public void registerEventListener(Listener aListener)
    public List getSelectedFiles ()
}

ビューにそのインターフェイスを実装させます。

public class View implements Display{
//The method implementations
}

そして、コントローラーで必要なすべてのバインディングを作成します。

public class Controller{
    private Display view;
    public Controller(){
        //Or use some DI technology
        this.view = new View();
        //Get a Listener implementation, maybe an Anonymous Inner Class
        this.view.registerEventListener(getListener());
    }

    public void processFiles(){
        List files = view.getSelectedFiles();
        //Do the processing here
    }

}
于 2012-06-02T20:21:08.193 に答える
4

考えられる解決策の1つ:

  • addView(View view)コントローラにメソッドを与えるだけです
  • 同様に、Viewの場合はaddController(Controller controller)メソッドを指定します。
  • これらを使用する前に設定する必要があることをドキュメントの一部にしてください。
  • 参照変数はコンストラクターで設定されないため、使用する前に必ずnullでないことを確認してください。
于 2012-06-02T19:31:15.523 に答える
1

そうですね、カプセル化と遅延初期化プロセスを使用できると思います。コントローラが初期化されると同時にビューが必要になることはないと確信しています。その逆も同様です。そうでない場合は、Beanのlazyinitプロパティと組み合わせて上記の回答を行うこともできます。

于 2012-06-02T19:35:02.463 に答える
0

ビューとコントローラーを正しくバインドするには、*。aspxページを右クリックして、[コントローラーに移動]メニューを選択します。ここで、尊敬されるコントローラーに次の構文のメソッドを追加します。

public ActionResult viewName()
{
   return view()
}  

ここで、viewnameは、例のビューの名前です。.netでは、aspx拡張子のないページの名前です。ビューを右クリックして[表示に移動]メニューを選択すると、尊重されたページに移動します。これにより、ビューとコントローラーが適切にバインドされていることが確認されます。

于 2012-06-05T08:19:10.047 に答える
0

4つのセクションを作成します:1-コントロール2-モデル3-ビュー4-ビューインターフェイス

セクション4は、コントロールとビューの中間層です。ビューを初期化するときは、次のようなIControlインターフェイスを初期化します。

IControl control = new ControlUtil((IViewUtil(new ViewUtil());

ビューインターフェイスを使用するコントロールに渡します。ビューがコントロールを呼び出したい場合、「コントロールが何かを実行します。必要な場合に備えて、これが私のインターフェースです。

于 2018-07-16T07:00:35.383 に答える