- ベストアンサー
ゲーム画面の項目選択の結果を外部クラスが知るには
ゲーム画面のある項目を選択すると、その値と画面を返すコードを作りたいです。 各画面は別クラスで以下のように同じselectItemメソッドを持っているものとします。 public class windowA { public int selectItem A() { return ret; } } 各ウィンドウは別の管理クラスXから抽象化して呼び出され クラスXがすべての結果を知るためにはどのような型、あるいはメソッドを用意するべきでしょうか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こういう時こそオブザーバーパターンというデザインパターンを適用するのだ。 --- ItemSelectedEventLister.java --- public interface ItemSelectedEventListener { public void itemSelected(int seceltedItem); } --- windowA.java --- public class windowA { private List<ItemSelectedEventListner> list = new ArrayList<ItemSelectedEventLister>(); public addItemSelectedEventListener(ItemSelectedEventListener l) { if(l != null) { this.list.add(l); } } public int selectItem A() { // ←ここの部分ちょっと意味分からない for(ItemSelectedEventListener l : list) { l.itemSelected(ret); } return ret; } --- ItemSelectObserver.java --- public class ItemSelectObserver implements ItemSelectEventListener { @Override public void itemSelected(int seceltedItem) { System.out.printf("ゲーム画面で選ばれたのは%s\n", selectedItem); } } あなたの構想を元に考えるとItemSelectedObserverが管理クラスXになるのが良いのではないか。 ・クラスXはItemSelectEventListenerを実装している。 ・クラスXがwindowAを作る。 ・windowA#addItemSelectedEventListener(this);する。thisはクラスXのインスタンス。 ・windowAで項目を選択すると、クラスXのitemSelectedメソッドが呼ばれる。 ・この時にwindowAが相手しているのはあくまでItemSelectedEventListenerインターフェースであり、その実体がクラスXのインスタンスだという事には一切関知しない。クラスXとwindowAが疎結合になるわけだ。
お礼
こういうときにObserverパターンを使うのですね。 >public int selectItem A() { // ←ここの部分ちょっと意味分からない すみません、これはよく分からなかったので仮に置いただけでした。 Windowの親クラスを通知者、WindowManagerクラスを観察者とすることで 作りたいものができそうです。 ありがとうございました。