実際、プレゼンターimpl [1]はビュー(インターフェース)を必要としますが、プレゼンターインターフェースは一般的に必要ありません。
典型的なパターンは次のとおりです。
interface FooPresenter {
// methods called by the view (generally in response to user interaction)
void doSomething(String foo);
}
interface FooView {
/** Tells the view which presenter instance to call back. */
void setPresenter(FooPresenter presenter);
// methods called by the presenter to control the view
void showSomething(String foo);
}
class FooPresenterImpl implements FooPresenter {
private final FooView view;
FooPresenterImpl(FooView view, /* other dependencies here */) {
this.view = view;
}
// could also be the start() method of com.google.gwt.activity.shared.Activity
public void init() {
view.setPresenter(this);
}
// optional; could be called from onStop() and onCancel() if using Activity
public void dispose() {
view.setPresenter(null);
}
}
実際、私は通常、ビューインターフェイス内にネストされたプレゼンターインターフェイスを宣言します。
interface FooView extends IsWidget {
interface Presenter {
// ...
}
void setPresenter(Presenter presenter);
// ...
}
class FooPresenter extends AbstractActivity implements FooView.Presenter {
// ...
}
Wrt implsはimplsを知っていますが、最も重要なのは、プレゼンターimplがビューimplを参照しないことです。これは、(一般に)GWTTestCase
(ビューをモックする)なしでユニットテストを実行できないためです。逆はそれほど問題ではありませんが、プレゼンターインターフェイスとimplは実際には必要ありません。
[1]技術的にはビューの実装である可能性がありますが、通常は逆であるため、ビューはプレゼンターよりも長持ちします(プレゼンターは、DOM操作のために作成時間が無視できないビューとは対照的に、一般的に軽量です)