2008年5月 のアーカイブ

やる夫がデザインパターンをやるようです 第17回

やる夫がデザインパターンをやるようです 第17回をはてなブックマークに追加 やる夫がデザインパターンをやるようです 第17回をdel.icio.usに追加 Yahoo!ブックマークに登録 やる夫がデザインパターンをやるようです 第17回をGoogle Bookmarksに追加

2008年5月29日 木曜日
      ____
     /\  /\  今日はおいらがオブザーバパターンを
   /( ●)  (●)\ 解説するお!!
  / :::::⌒(__人__)⌒:::::\
  |     |r┬-|       |
  \     ` ー'´     /
       ____
     /⌒  ⌒\   まず、ヲチ(監視)したい対象を決めるお。
   /( ―)  (―)\  ヲチしたいと思った人がオブザーバだお
  /::::::⌒(__人__)⌒::::: \
  |              |
  \               /
      ____
    /_ノ   ヽ_\   ヲチされるほうは、パブリッシャとかって
   /( ●) ( ●)\  呼ばれるお。新聞とかブログとかで例えると
 / ::::::⌒(__人__)⌒:::::\ わっかりやすいお。ヲチするほうは、
 |        ̄      | 購読者だからサブスクライバだお
 \              /   カタカナが難しいなら出版社と購読者だお
     ____
    / ⌒  ⌒  \    おいらはおいらが好きだから
  ./( ―) ( ●)  \ やる夫で学ぶデザインパターンを購読するお。
  /::⌒(_人_)⌒:::::  | フィードビューアにRSSフィードを登録して
  |    ー       .| おいらはオブザーバになったお。
  \          /
       ____
     /⌒  ⌒\    フィードを登録しておくと、
   /( >)  (<)\ やる夫で学ぶデザインパターンが更新されると
  /::::::⌒(__人__)⌒::::: \  新しい記事が見れるようになるお!!
  |    /| | | | |     |
  \  (、`ー―'´,    /
       ̄ ̄ ̄
     ____
   /      \  このふわっとした要約を
  /  ─    ─\  NicoshBrothersXの実装で
/    (●)  (●) \デザインパターンの解説してみるお
|       (__人__)    |
/     ∩ノ ⊃  /
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /
public interface Observer {
// 通知を受ける
public void update( int hp, int sp, string itemNm );
}
        / ̄ ̄ ̄\  オブザーバのインターフェイスだお。
        /        \ 体力とか必殺ゲージとか保持アイテムが
     /   ─   ─  ヽ 変わったらupdateを呼んでほしいお
      |   (●)  (●)  |
     \   (__人__) __,/
      /         \
public interface Subject {
// オブザーバを登録できる。
public void registerObserver( Observer obsrvInst );
// 登録したオブザーバを削除できる。
public void removeObserver( Observer obsrvInst );
// 登録したオブザーバに通知する。
public void notifyObservers();
}
     / ̄ ̄ ̄\   こっちはさっきの説明で言う
   /        \ 出版社だお。
  /   ⌒    ⌒   \. notifyObserversがオブザーバの
  |   (●)::::::(●)   | updateを使うメソッドだお。
  \ :::: (__人__) :::: /
  /.   .  `V´     \
      ____
     /\  /\  じゃあインプリメントしてみるお
   /( ●)  (●)\
  / :::::⌒(__人__)⌒:::::\
  |     |r┬-|       |
  \     ` ー'´     /
public class NicoshData implements Subject {
private ArrayList observers;
private int hitPoint;
private int nicoshPoint;
private String currentItem;
public NicoshData(){
observers = new ArrayList();
}
// オブザーバを登録していく
public void registerObserver( Observer obsrvInst ){
observers.add( obsrvInst );
}
// 通知の必要がなくなったら削除していく
public void removeObserver( Observer obsrvInst ){
int idx = observers.indexOf( obsrvInst );
if( idx >= 0 ){
observers.remove( idx );
}
}
// リスト内のオブザーバに通知していく
public void notifyObservers(){
for( int idx = 0; idx < observers.size(); idx++ ){
Observer observer = ( Observer )observers.get( idx );
observer.update( hitPoint, nicoshPoint, currentItem );
}
}
//   hitPoint / nicoshPoint / currentItem のプロパティセッター
}
      ____
    /_ノ   ヽ_\   Subjectのインプリメントは
   /( ●) ( ●)\  こんな感じだお
 / ::::::⌒(__人__)⌒:::::\  続いてObserverだお
 |        ̄      |
 \              /
// 文字表示をするクラス
public class CharactericDsp implements Observer {
private Subject nicoshData;
private int hitPoint;
private int nicoshPoint;
private String currentItem;
// コンストラクタでSubjectの参照をもらって登録する
public CharactericDsp( Subject nicoshData ){
this.nicoshData = nicoshData;
nicoshData.registerObserver( this );
}
public void update( int hp, int sp, string itemNm ){
this.hitPoint = hp;
this.nicoshPoint = sp;
this.currentItem = itemNm;
// 通知を受けたら文字表示処理を行う。
System.out.println(
"HP:" + hitPoint +
" SP:" + nicoshPoint +
" アイテム:" + currentItem );
}
// Subjectの参照を持っていると自身で監視の削除が出来る
public unSubscribe(){
this.nicoshData.removeObserver( this );
}
}
// グラフ表示をするクラス
public class GraphDsp implements Observer {
//
}
// イメージで表示するクラス「><大変!」とか。
public class ImageDsp implements Observer {
//
}
       ____
     /⌒  ⌒\  これでオブザーバインターフェイスを
   /( ―)  (―)\ インプリメントしていればどんなクラスでも
  /::::::⌒(__人__)⌒::::: \ NicoshDataの内容通知が受けられるお
  |              | updateの内容は実装依存だお
  \               /  クラスごとに好き勝手に振舞いを決めればいいお
       ____
     /_ノ   ヽ_\  さらに調子に乗って
   /( >)  (<)\ java.uril.Observerの解説もするお!
  /::::::⌒(__人__)⌒::::: \
  |     |r┬-/      |
  \     ` ̄'´     /
 
import java.uril.Observable; // Subject
import java.util.Observer;
public class CharactericDsp implements Observer {
private Observable observable;
private int hitPoint;
private int nicoshPoint;
private String currentItem;
// コンストラクタでSubjectの参照をもらって登録する
public CharactericDsp( Observable observable ){
this.observable = observable;
//    nicoshData.registerObserver( this );
observable.addObserver( this );
}
public void update( Observable obs, Object arg ){
if( obs instanceof NicoshData ){
NicoshData nicoshData = ( NicoshData )obs;
this.hitPoint = nicoshData.getHitPoint();
this.nicoshPoint = nicoshData.getNicoshPoint();
this.currentItem = nicoshData.getCurrentItem();
// 通知を受けたら文字表示処理を行う。
System.out.println(
"HP:" + hitPoint +
" SP:" + nicoshPoint +
" アイテム:" + currentItem );
}
}
// Subjectの参照を持っていると自身で監視の削除が出来る
public unSubscribe(){
//    this.nicoshData.removeObserver( this );
this.nicoshData.deleteObserver( this );
}
}
     ____
    / ⌒  ⌒  \    updateの引数をみると
  ./( ―) ( ●)  \  Observableが渡ってくるお。
  /::⌒(_人_)⌒:::::  | データをプル(とる)しているんだお。
  |    ー       .| 
  \          /   Observableは以下のメソッドが用意されてるお
void addObserver(Observer o)
protected  void clearChanged()
int countObservers()
void deleteObserver(Observer o)
void deleteObservers()
boolean hasChanged()
void notifyObservers()
void notifyObservers(Object arg)
protected  void setChanged()
      γ⌒) ))  オブザーバをまとめるお!
      / ⊃__   オブザーバパターンを使うと。。
   〃/ / ⌒  ⌒\
  γ⌒)( ⌒)  (⌒) \ ∩⌒)
 / _ノ :::⌒(__人__)⌒ 〃/ ノ
(  <|  |   |r┬(    / / ))
( \ ヽ \ _`ー‐'  /( ⌒)
               / /
    / ̄ ̄\    相互にやり取りするオブジェクト間を
  /   _ノ  \           ___(⌒ヽ
  |    ( ●)(●)         /⌒  ⌒⊂_ ヽ
.  |     (__人__)  (⌒ヽ∩/( ⌒)  (⌒) |(⌒ヽ
   |     ` ⌒´ノ   ヽ  ノ| :::⌒(__人__)⌒ ::| ⊂ `、
.   |         }     \ \    )┬-|   / /> ) ))
.   ヽ        }   .(( (⌒ )、 ヽ_ `ー‐' ,// /
    ヽ     ノ       \ \ /         /
    /    く         ヽ_ ノ       (
   相互にやり取り・・・
             疎結合に設計できるようになるお!!!
         __                  γ⌒) ))
     γ⌒) ))\              / ⊃__
    / ⊃ _ノ  \ ∩⌒) ))   〃/ / ⌒  ⌒\
 〃/ /  ( ●)(●) / ノ     γ⌒)( ⌒)  (⌒) \ ∩⌒)
   γ⌒)  (__人__)/ / ))  / _ノ :::⌒(__人__)⌒ 〃/ ノ
  / _ノ   .` ⌒´ノ( ⌒)   (  <|  |   |r┬(    / / ))
 (  <        }/ /.    ( \ ヽ \ _`ー‐'  /( ⌒)
(( \ ヽ      . } /                    / /
   こうか?
   / ̄ ̄\ 
 /  _ノ   \ やる夫。今回はちゃんとまとまったな。
 |   ( ●)(●)l お前に任しておけばプロジェクトは
. |    (__人__) | 安泰だ。会社も安泰だ。
  |    ` ⌒´ | いや、俺を弟子にしてほしいくらいだ。
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   /     ヽ
           __
         .-´   ``ヽ
        / ⌒      `ヽ  今までのことは水に流すお。
      /        `ヽ  ヽ おいらについてこいだお。
 ((   / (●)          ヽ
     |::⌒(__   (● )     |
     ヽ   人__) ⌒::::      |
       ヽ(__ン          |
      人           /  | |
     /          _ノ  ノノ 
                 |
`――――――――――――○―――――――――――――――’
                O
  ガバッ ! !  ______    o
        /:υ::─ニjjニ─ヾ 
      /:::li|.:( ○)三 ( ○)\
      (:::||!.:υ::::: (__人__)):::: i| 
    〃 ):::::::::::.   |r┬-| li::::/      ____
      /: : : : : : l\`ー '/j: : ::ヽ      ||13: 00 || |
    \ヽ :ヽ: : : : 7ヽ />: : : :r:\      ̄ ̄ ̄ ̄
     ( ̄ ⌒⌒⌒⌒ ̄⌒ ⌒ ⌒ヽ 
      ヽ       ,.-―- 、   \  
       ヽ     /::::::::::::::::::ヽ    \
       ____
     /     \  え。。。もう会社来なくていいのかお。。。?
   /::::::::::::::::    \ _
  /::::::::::::::::       || |
  |::::::::::::::::::::::::     ∩! ,ヽ _
  \::::::::::::::::       | ー ノ
   | :::::::::::::::    | i j  ̄ ̄ ̄|
   |  :::::::::::::    ゝ__/____i
   |  ::::::::::     /      /
  (__(__   ヽ⌒⌒⌒ヽ
  /  ,_/  ___ノ    /
  `ー'  `ー'       /
というわけで、オブザーバパターンをやる夫に解説させてみました。
Observerパターンはオブジェクト間の1対多の依存関係を定義し、あるオブジェクトの状態が変化すると、それに依存している全てのオブジェクトが自動的に通知され更新されるようにします。

前回はシモネタで今回は夢オチというひどい有様で小学生並みの着地点です。もうほんとびっくりです(今日の晩飯が出前のピザだったことが)

≪第16回第18回≫

やる夫がデザインパターンをやるようです 第16回

やる夫がデザインパターンをやるようです 第16回をはてなブックマークに追加 やる夫がデザインパターンをやるようです 第16回をdel.icio.usに追加 Yahoo!ブックマークに登録 やる夫がデザインパターンをやるようです 第16回をGoogle Bookmarksに追加

2008年5月27日 火曜日

≪第15回第17回≫

   / ̄ ̄\  オブザーバだってのっけから言ってんだから
 /   _ノ  \ 意識して実装してもらわなきゃ困るだろ
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
      ____   「オブザーバとは」でググっても
    /_ノ   ヽ_\ 日本語でおkなサイトしかなかったからだお
   /( ●) ( ●)\
 / ::::::⌒(__人__)⌒:::::\
 |        ̄      |
 \              /
       ____  この業界の8割は自分で言ってることが
     /⌒  ⌒\ なんだか分かってないやつばかりだお
   /( ―)  (―)\
  /::::::⌒(__人__)⌒::::: \
  |              |
  \               /
 コンポジットしているインスタンスにデリゲートして拡張し、
 具象実装に対する依存度をへらすのである。
          ____
       / \  /\  キリッ
.     / (ー)  (ー)\
    /   ⌒(__人__)⌒ \
    |      |r┬-|    |
     \     `ー'´   /
    ノ            \
  /´               ヽ
 |    l              \
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
     |  |   |   |
     _||_||__||  ||
    (__/   `ー――
   (___/  r
    (_レノ)\   ___
    (__/__/
       ____   VIPならポンコまで読んだ
     /⌒  ⌒\  って言われるお
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \
  |     |r┬-|     |
  \      `ー'´     /
■コンポジットしているインスタンス
→あるクラスが保持しているメンバインスタンス

class Hoge {
private Moge mogeInst; // <-コレ
}

■デリゲートして
→委譲する→(処理を)任して

class Hoge {
private Moge mogeInst;
public void method(){
mogeInst.doit(); // <-コレ
}

■拡張し、
→上記mogeInstは拡張したサブクラスでnewされることで処理を動的に入れ替えできる

class Hoge {
private Moge mogeInst;
public void setMoge( Moge param ){
mogeInst = param; // <- コレ
}
////////// 使うときは //////////////
hogeInst.setMoge( new SubMoge() ); // <- コレ

■具象実装に対する依存度をへらすのである。
→インターフェイスやスーパータイプへのプログラミングの

Dog dog = new Dog();
dog.bark(); // <- 犬が吠えるという具象実装がされている例
Animal dog = getAnimal();
// 動物インターフェイス・スーパータイプへの(吠える)実装がされている例
dog.makeSound();

→前者でこれを実装したクラスは、Dogに依存し、後者は動物というインターフェイス・スーパータイプへ依存している。

               ごちゃごちゃいってねぇで
        / ̄ ̄\   コードなおせこのハゲ
      /       \ いつになったらカプセル化を覚えんだ
      |::::::        |
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´
    _/⌒  ⌒\_
  /:●))(__人__)((● \  はいお。。。
  |     |r┬-|     |  あんまりぶたないでほしいお。
  \      `ー'┃     /
     ____
   /      \ ( ;;;;( オブザーバ・・・?ってのは
  /  _ノ  ヽ__\) ;;;;) ヲチャ(watcher)のことらしいお
/    (─)  (─ /;;/  てことは
|       (__人__) l;;,´
/      ∩ ノ)━・'/
(  \ / _ノ´.|  |
.\  "  /__|  |
  \ /___
     ____
   /      \   NicoshDataクラスがステータスを受ける
  /  ─    ─\  ブリッジをしてくれるわけだから
/    (●)  (●) \ こいつをヲチすればいいお。。。
|       (__人__)    |
/     ∩ノ ⊃  /
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /
     ____
   /      \  表示系のcharactericDspInstインスタンスとかが
  /  ─    ─\ NicoshDataクラスのヲチャってことかお。。
/    (○)  (○) \
|       (__人__)    |
/     ∩ノ ⊃  /
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /
        ノ L____
       ⌒ \ / \   なぞは全てときtあろ!!!
      / (○) (○)\
     /    (__人__)   \
     |       |::::::|     |
     \       l;;;;;;l    /l!| !
     /     `ー'    \ |i
   /          ヽ !l ヽi
   (   丶- 、       しE |そ  ブヒッ!!
    `ー、_ノ       ∑ l、E ノ <
               レY^V^ヽl
   / ̄ ̄\     (こいつ今 噛んだのか?)
 /   _ノ  \   わかったようだな。
 |    ( ●)(●) オブザーバとして表示系の実装をすれば
. |     (__人__) NicoshDataクラスはそいつらの扱いが楽だろ
  |     ` ⌒´ノ NicoshDataクラスはjavaで言うObservableで
.  |         } 考えることが出来るだろう。
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
       ____ (おならをかき消したのはばれてないみたいだお)
     /⌒三 ⌒\ じゃあ実装してみるお
   /( ―)三(―)\
  /::::::⌒(__人__)⌒::::: \
  |     |r┬-|     |
  \      `ー'´     /
public interface Observer {
// 通知を受ける
public void update( int hp, int sp, string itemNm );
}
public interface Subject {
// オブザーバを登録できる。
public void registerObserver( Observer obsrvInst );
// 登録したオブザーバを削除できる。
public void removeObserver( Observer obsrvInst );
// 登録したオブザーバに通知する。
public void notifyObservers();
}
     ____
    / ⌒  ⌒  \
  ./( ―) ( ●)  \
  /::⌒(_人_)⌒:::::  | チラッ
  |    ー       .|
  \          /
   / ̄ ̄\
 /   _ノ  \   インターフェイスは悪くないな
 |    ( ●)(●) (なんか匂うんだが。。。)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
public class NicoshData implements Subject {
// 通知するオブザーバ群を保持する
private ArrayList observers;
     ____  あとはインターフェイスのインプリメントだお
    / ⌒  ⌒  \
  ./( ―) ( ●)  \
  /::⌒(_人_)⌒:::::  | チラッ
  |    ー       .|
  \          /
   / ̄ ̄\
 /   _ノ  \   (チラチラうぜぇな)
 |    ( ●)(●) そういうことだ。
. |     (__人__) じゃあ次回はオブザーバを
  |     ` ⌒´ノ やる夫がまとめてみろ。
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
        ノ L____
       ⌒ \ / \  おいらにまかせてくださいお!
      / (○) (○)\
     /    (__人__)   \
     |       |::::::|     |
     \       l;;;;;;l    /l!| !
     /     `ー'    \ |i
   /          ヽ !l ヽi
   (   丶- 、       しE |そ  ブヒッ!!
    `ー、_ノ       ∑ l、E ノ <
               レY^V^ヽl
   / ̄ ̄\
 /   _ノ  \   (ブヒッ・・・だと・・・?)
 |    ( ○)(○)  ・・・お、おお。がんばれ。
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
     ____
    / ⌒  ⌒  \
  ./( ―) ( ○)U \
  /::⌒(_人_)⌒:::::  | チラッ
  |    ー    U  .|
  \          /
   / ̄ ̄\
 /   _ノ  \  (それでさっきからチラチラみてんのか)
 |    ( ○)(○)なにを俺に通知したいんだ・・・?
. | U   (__人__)
  |     ` ⌒´ノ
.  |U U      }
.  ヽ        }
実は、javaにはjava.util.Observerというインターフェイスがあります。このインターフェイスは、やる夫が書いたようにupdateというインターフェイスを持っていて、実際にはupdate(Observable o, Object arg) というメソッドをインプリメントする必要があります。
第2引数は通知内容ですが、第1引数は上記サンプルで言うSubjectインターフェイスです。なぜこのインターフェイスを渡すのかなどもあわせて次回解説したいと思います。

≪第15回第17回≫

やる夫がデザインパターンをやるようです 第15回

やる夫がデザインパターンをやるようです 第15回をはてなブックマークに追加 やる夫がデザインパターンをやるようです 第15回をdel.icio.usに追加 Yahoo!ブックマークに登録 やる夫がデザインパターンをやるようです 第15回をGoogle Bookmarksに追加

2008年5月26日 月曜日
≪第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回≫