≪第14回・
第16回≫
ネットオークションや、アマゾンなどのサービスでウォッチリストという言葉を聴いたことがありませんか。あるいは、好きなブログをRSSにて定期購読していたりしませんか。このように、ある情報や事象を監視する人たちのことをオブザーバとかって言われるのですが、デザインパターンでもオブザーバパターンというものがあります。今回はこのオブザーバパターンを使って「疎結合」についてさらに触れていきたいと思います。
/ ̄ ̄\ 今回オマエに覚えておいてほしいパターンは
/ _ノ \ オブザーバパターンだ。
| ( ●)(●) オブザーバという意味は分かるか?
. | (__人__)
| ` ⌒´ノ
. | }
. ヽ }
ヽ ノ
/ く
| \
| |ヽ、二⌒)
____
/⌒ ⌒\ まかせてくれお!
. /( ●) (●)\ 「オブザーバとは」っと!
/ ::::::⌒(__人__)⌒::::: \
| |r┬-| |
\ `ー'´ /
ノ \
/´ ヽ カ
| l l||l 从人 l||l l||l 从人 l||l カ タ
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. タ
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐
,. - ''"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ρ ̄`l
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ノ ̄
会議での発言権はあるが議決権はない存在
____ ラテン語で監視するを意味するobsevare
/::::::─三三─\ 会議などで特別に出席する事を許された人
/:::::::: ( ○)三(○)\ 立会人
|::::::::::::::::::::(__人__):::: | ________
\::::::::: |r┬-| / | | |
ノ:::::::::::: `ー'´ \ | | |
___
/ ⌒ ⌒\ 日本語でおkなのがいっぱいだったお!
/ (●) (●) \
/ ///(__人__)/// \
| u. `Y⌒y'´ |
\ ゙ー ′ ,/
/⌒ヽ ー‐ ィヽ
/ rー'ゝ 〆ヽ
/,ノヾ ,> ヾ_ノ,|
| ヽ〆 |´ |
/ ̄ ̄\ (なんでそんなにキラキラしてんだ?)
/ _ノ \ そうか。デザインパターンでは総じて
| ( ●)(●) 「見てる人」で理解してもらえればいいだろう
. | (__人__) オマエ向けに言うと「ヲチ」とも言える。
| ` ⌒´ノ オマエのブラウザのお気に入りを・・・
. | }
. ヽ }
ヽ ノ
/ く
| \
| |ヽ、二⌒)
ノ L____
⌒ \ / \ そんなこと言っても
/ (○) (○)\ ブラウザの履歴は見せられないお!!
/ (__人__) \
| |::::::| |
\ l;;;;;;l /l!| !
/ `ー' \ |i
/ ヽ !l ヽi
( 丶- 、 しE |そ ドンッ!!
`ー、_ノ ∑ l、E ノ <
レY^V^ヽl
/ ̄ ̄\ いやいや前回の主張を無理にかぶせてくんなボケ
/ _ノ \ (満足に説明できたためしがねぇ)
| ( ○)(○)
. | (__人__)
| ` ⌒´ノ
. | }
. ヽ }
ヽ ノ
/ く
| \
| |ヽ、二⌒)
ノ L____
⌒ \ / \
/ (○) (○)\ googleの検索履歴も見せられないお!!
/ (__人__) \
| |::::::| |
\ l;;;;;;l /l!| !
/ `ー' \ |i
/ ヽ !l ヽi
( 丶- 、 しE |そ ドンッ!!
`ー、_ノ ∑ l、E ノ <
レY^V^ヽl
それでは早速オブザーバパターンについて見ていきます。
やる夫が今回携わるのは、ニコッシュブラザーズXというアクションゲームのキャラクターのステータス表示部分です。各々のステータスはヒットポイント(体力)・ダメージ蓄積ポイント(必殺ゲージ)・持ち物(保持アイテム)があります。
コードを見てみると非常に単純なものでした。
class NicoshData{
public int getHitPoint();
public int getNicoshPoint();
public String getCurrentItem();
public void stateChanged();
}
これらの体力や、必殺ゲージの値が誰がどうやって設定しているかは知らなくていいとのことで、またstateChangedメソッドはステータスが新しいデータに変更されるたびに呼び出されます。呼び出すタイミングなどは知りませんが、呼び出されるということだけが分かっています。
そして、これらのステータス群をグラフ表示や数値表示など様々な方法で表示するというのがやる夫の仕事です。
把握したお。あんまりぶたないでほしいお。
_/⌒ ⌒\_
/:●))(__人__)((● \
| |r┬-| |
\ `ー'┃ /
____ こんなん来たもんを更新していきゃいいだけだお
/ \
/ ─ ─\
/ (●) (●) \
| (__人__) | ________
\ ` ⌒´ ,/ .| | |
ノ \ | | |
/´ | | |
| l | | |
ヽ -一ー_~、⌒)^),-、 | |_________|
ヽ ____,ノγ⌒ヽ)ニニ- ̄ | | |
// メンバインスタンス
// ・・・・
// 更新時に呼ばれるらしい
public void stateChanged(){
int hitPoint = getHitPoint();
int nicoshPoint = getNicoshPoint();
String itemName = getCurrentItem();
// 数値・文字列で表示
charactericDspInst.update( hitPoint, nicoshPoint, itemName );
// グラフで表示
graphDspInst.update( hitPoint, nicoshPoint, itemName );
// イメージで表示
imageDspInst.update( hitPoint, nicoshPoint, itemName );
}
____
/ \ /\ キリッ
. / (ー) (ー)\
/ ⌒(__人__)⌒ \ これ以上でもこれ以下でもない
| |r┬-| | 流麗なコードがかけてしまったお
\ `ー'´ /
ノ \
/´ ヽ
/ ̄ ̄\
/ \ 正直こういうコードを書くことを期待してたわ
|:::::: | (1発で理解されてもかなわんしな)
. |::::::::::: |
|:::::::::::::: | ....,:::´, .
. |:::::::::::::: } ....:::,, ..
. ヽ:::::::::::::: } ,):::::::ノ .
ヽ:::::::::: ノ (:::::ソ: .
/:::::::::::: く ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
|:::::::::::::::|ヽ、二⌒)━~~'´
|┃三 ガラッ
|┃ ____
|┃/⌒ ⌒\
|┃(●) (●) \ ぎゃっは。天才は帰るお
――‐.|┃:⌒(__人__)⌒:::::\ じゃあおつかれしたーお
|┃ |r┬-| |⌒)
|┃ `ー'ォ //
(⌒ヽ  ̄ /
|┃ノ /
/ ̄ ̄\ ( ;;;;(
/ _ノ ヽ\ ) ;;;;) 勝手に帰んじゃねーダボが
| ( ○) (○)/;;/
. | (__人__) l;;,
| ∩ ノ)━・'/
. | / ノ´ }
. ヽ / / }
ヽ/ / ノ
せっかくおいらのハカーがスーパーになったのに
おまいらエラソな肩書きもってるのはダボの
言うことはスーパーに帰ってもいいはずだから
勝手じゃなくて肩書きがおまいらにハカーだお
γ ⌒⌒ヽ
/ ̄ ̄\ ( ( ヽ ) ノ
/_ノ \ (⌒) 三 ノ 从 ゝ
( ●)( ●) ヽ 三/ | ニ ____ (⌒)
. | (__人__) u } | | /\ / ) し / | ミ
| ` ⌒´ ノ ! 、 /(○ )::(○ )⌒\/ | ミ
. | } \./:::::::(_人_):::::::: i' |
. ヽ } | )ww) | |
ヽ ノ ヘ \ `ー" ノ
/ く 、_/っ/ \ . . \
| \--一'' \
| |ヽ、二⌒)、 \
わかったわかった
とりあえず冷静になってくれ
updateメソッドを使ってる3つのクラスは
/ ̄ ̄\ インターフェイスがそろってんのになんで
/ _ノ \ あんな硬直した使い方してるんだ?
| ( ●)(●) ____
. | U (__人__) / \
| ` ⌒´| /─ ─ \ フヒ?
. | } \ / (●) (●) \
. ヽ } \ | (__人__) |
ヽ ノ \ \ _/
/ く. \ \ ノ \
| \ \ (⌒二 |
| |ヽ、二⌒)、 \ | |
やる夫が実装した方法でももちろん実現は可能です。ですが、3つのインスタンス(charactericDspInst / graphDspInst / imageDspInst)をまともに具象実装に対してコーディングしているため、これ以外の表示系インスタンスの追加や削除を行える方法がありません。多分、「拡張をどうするのか?」と問われると「継承すればいいお!」とかいいはじめるんだと思います。
次回は、オブザーバパターンを使った解決へ進めていきたいと思います。
≪第14回・
第16回≫