2009-04-11 8 views
0

私は、モデルとそのインターフェイスとのペアを作成したいと思います。私は、ビューが更新される時期と頻度を制御したい。 PropertyChangeListenerのようなものはうまくいきません(各プロパティが設定された後にイベントが発生する場所)。GUIパターン質問:PropertyChangeListenerと特殊化された表示インターフェイス

私は特定のGUIフレームワークのために開発していません。ここでの目標は、さまざまなGUIフロントエンドを交換する機能です(今はテストのためですが、後でアプリのさまざまなバージョンで役に立つかもしれません)。これらはSwingかもしれないし、Webブラウザ(例えばGWT経由)かもしれない。

以下は私のアプローチです。このビューは、更新するメソッドを提供するためのインタフェースを実装しています。これはコントローラがモデルの更新を完了したと判断したときにトリガされます。コントローラはモデルを介したビューとのみ対話しているため、コントローラはビ​​ューの特定の実装に依存していないため、これはまだ私にとってはうってつけです。

だから、私は私の質問(複数可)

  • はよくこの作業を行いますされていると思いますか?
  • この標準的な方法はありますか?
  • このパターンには名前がありますか?

ラフのサンプルコード(Javaの):

// Controller, manages Items (the model) 
class ItemList { 

    void addItem(Item item) { 
    } 

    void doStuffWithItems() { 

    // perform some set of operations, such as sorting or layout 
    for (Item item : items) { 
     // .... 
    } 

    // now with everything in it's final position: 
    for (Item item : items) { 
     item.updateView(); 
    } 
    } 
} 

// Model 
class Item { 
    private int top; 
    private int left; 
    private int width; 
    private int height; 

    // Can remember it's previous position/size: 
    public void savePostion() { 
    } 

    // And recall it for the Controller to use: 
    public public Position getSavedPosition() { 
    } 

    // Plus some other useful functions: 
    public boolean intersectsWith(Item other) { 

    } 

    public void updateView() { 
    this.view.update(); 
    } 

    void setView(ItemView view) { 
    this.view = view; 
    } 
} 

// Interface used by View implementations 
public interface ItemView { 
    // Trigger the view to reflect the current state of the model 
    void update(); 
} 

// Example, as a Swing component 
class ItemComponent extends JComponent implements ItemView { 
    private Item item; 

    public ItemComponent(Item item) { 
    this.item = item; 
    item.setView(this); 
    } 

    // ItemView#update 
    public void update() { 
    // update the component's size/position 
    setBounds(new Rectangle(item.getLeft(), item.getTop(), item.getWidth(), item.getHeight())); 
    } 

    @Override 
    public void paint(Graphics g) { 
    // ... 
    } 
} 

答えて

2

は、私が唯一の変更通知のためのインターフェイスを実装するには、[View]を強制的に避けるだろう。モデルの代わりに別の「今すぐ更新」イベントを作成します。

0

モデルは、ビューを直接制御したり、知っているべきではありません。ビューはコントローラにコールバックを登録する必要があります。コントローラはビ​​ューを更新するタイミングを伝えることができます。 modelChangedEventに外部リスナーを許可することができます。モデルがビューがあることを知ることなく、ビューはその点でモデルに登録できます。 MVCのJ2EE blueprintおよびモデルの状態変更の間接的なイベント通知がどのようにあるかを参照してください。

0

コンピュータのデスクトップで動作する従来のアプリケーションでは、Passive Viewの亜種をお勧めします。フォームの作成と管理を担当するクラスは、イベントをUIオブジェクトに渡すシンシェルです。 UI_Objectは、インターフェイスを介してフォームと対話します。言い換えれば、UIオブジェクトはUI_Viewインタフェースを実装し、オブジェクト階層の下位に位置するView Controllerに自身を登録します。

UI_Objectは、モデルを変更するCommand Patternを実装するオブジェクトを実行します。コマンドオブジェクトは、ビューコントロールによって公開されているインターフェイスを介してさまざまなビューとやりとりすることができます。

これは、フォームクラスをリッピングし、フォームインターフェイスを実装するスタブクラスに置き換えることができます。スタブクラスは、特に統合テストの自動テストに使用されます。

インターフェイスは、フォーム、UI_Object、コマンド、ビュー間の相互作用を正確に定義します。それらは相対的に言語に依存しないように設計できるので、プラットフォーム間での移植が容易になります。

あなたの例では欠けているものはコマンドオブジェクトです。あなたはこのような構造を必要とする

  • ItemViewForms
  • ItemViewImplementation
  • ItemViewFormInterface
  • ItemViewCommands
  • ItemViewInterface
  • ItemViewImplementation

    中に、mymodel

組み込むITEMLIST

ItemComponentは、ItemViewInterfaceを使用してItemViewImplementationに登録します。

一連のイベントはこの

  • ユーザーのようなものが項目UI上
  • クリック数を更新したいなり
  • フォームを告げる(UI がマウスでクリック関与していることと仮定した場合) ItemViewImplementationを通じて ItemViewInterface Xは のYパラメータで完了しました。
  • ItemViewImplementationは次に は、Yから必要 パラメータ
  • コマンドオブジェクトY パラメータモデルを修正し は、次に更新する ItemViewInterface介し
  • ItemViewImplementationに指示取るとコマンドオブジェクトを作成しますUI。
  • ItemViewImplementationは、 ItemViewFormsに、ItemViewFormInterfaceを通じてUI を更新するように指示します。
  • ItemViewFormsが更新されます。

このアプローチの利点は、各レイヤーの相互作用がインターフェイスを通じて正確に定義されることです。ソフトウェアACTIONSは、コマンドオブジェクトにローカライズされています。フォームレイヤーは、結果を表示することに焦点を当てています。 Viewレイヤーは、コマンドとフォーム間のルーティングアクションと応答を処理します。コマンドは、モデルを変更する唯一のものです。また、フォーム実装を取り除いて単体テスト用のモックオブジェクトを含む任意のUIに置き換えることができます。

関連する問題