私はこの主題が死に至るまでカバーされていることを認識していますが、私はまだ苦労しており、特定の助けが必要です.
私の目的は、ある種のオブザーバブル (Dog としましょう) とある種のリスナー (Owner としましょう) の間に単純な Observer パターンを実装することです。
最終的に、MVC パラダイムでは、Owner は「ビュー」になり、Dog は「モデル」になります。ここで物事を単純化しようとするためだけに、Dog と Owner を使用しています。
Java のビルトイン Observer/Observable クラスを使用しようとしましたが、Observers の update() メソッドがいかに悪いかを認識しました。POJO を受け取り、その POJO を update() メソッドでチェック/キャストする必要があります。「update()」メソッドが期待できるものを受け取るようにしたいと思っています。
そのため、犬/所有者を例として使用するこのチュートリアルを含む、いくつかのチュートリアルに従いました。
http://www.youtube.com/watch?v=qw0zZAte66A
ここでは、独自の Observer/Observed クラスをロールする方法を示しました。疑似コードでは、私が今持っているのはこれです:
Dog/Model {
List listeners;
public fireDogHungryEvent() {
foreach listener {
listener.onDogHungry(this);
}
}
public fireDogPeeEvent() {
foreach listener {
listener.onDogNeedsToPee(this);
}
}
public getHungerLevel() { return hungerLevel; }
public getBladderCapacity() { return bladderCapacity; }
}
Owner/View {
public onDogHungry(model) {
println(model.getHungerLevel());
}
public onDogNeedsToPee(model) {
println(model.getBladderCapacity());
}
}
そのため、1 つの update() メソッドではなく、特定のイベントを処理するメソッドを用意しました。素晴らしい。私は現在、オーナー/ビュー クラスに満足しています。それは犬/モデルの方法を知っていて、それは問題ありません(私は思います)。
私が気に入らないのは、犬/モデルが所有者/ビューのメソッドへの参照を持っていることです。私は数え切れないほど読んできましたが、モデルが上記のようにビューに密接に結合されるべきではないことに完全に同意します。また、ほぼ同じことを行う犬/モデルのすべての「火」メソッドにも熱心ではありません。すべてのリスナーをループし、各リスナーで異なるメソッドを呼び出すだけです。
この関係をさらに切り離して、犬/モデルが特定のメソッドを呼び出さないようにすることは可能ですか? もしそうなら、犬/モデルデータを所有者/ビューに受け取り、それを適切に操作するための最良の方法は何ですか?
ありがとう