私は、モデルとそのインターフェイスとのペアを作成したいと思います。私は、ビューが更新される時期と頻度を制御したい。 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) {
// ...
}
}