スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#によるデザインパターン入門 その2 Observerパターン(2)

前回は以下のコードでObserverパターンを説明しました。 
 
type myReactable = 
    abstract ReactToInt : int -> unit 
 
type myPublisher(in_n:int)= 
    let mutable reserved_n = in_n 
    let mySubscribers : ResizeArray<myReactable> = new ResizeArray<_>() 
    member this.AddSubscriber scr = 
        mySubscribers.Add(scr) 
    member this.Trigger () = 
        for scr in mySubscribers do 
            scr.ReactToInt(reserved_n)
 
let sub01 =
    {new myReactable with
        member this.ReactToInt n =
           printfn "%dが発行されました" n} 
let pub = new myPublisher(7)
 pub.AddSubscriber sub01;;
 
> pub.Trigger ();;
7が発行されました
 
今回はこの実装方法からsubscriber側はmyReactableインターフェイスを実装していなければならないという制約を取り除きたいと思います。
 
具体的にどうするかというと、上の例では、「myReactableインターフェイスを実装しているオブジェクト」を、登録していましたが、これの代わりに「関数」を登録して、関数からオブジェクトにアクションを呼び掛けることにします。つまり、仲介役として関数を用いるわけです。通常この関数をHandlerと呼びます。
 
上の例ではsubscriberに通知しなければならないのはintでしたから、関数の型をint->unitとして作成します。 
 (次の例では型推論に頼ってます)

type myPublisher(in_n:int)=
    let mutable reserved_n = in_n
    let myHandlers : ResizeArray<int->unit> = new ResizeArray<_>()
    //登録用
    member this.AddMyHandler handler =
        myHandlers.Add(handler)
    member this.Trigger () =
        for hdl in myHandlers do
            hdl reserved_n //関数の呼び出し
 
インスタンスを生成してみます。
> let pub = new myPublisher(7);;
val pub : myPublisher
 
handlerを登録します。
> pub.AddMyHandler(fun n -> printfn "%dが発行されました" n);;
val it : unit = ()
 
トリガーを引いてみます。
> pub.Trigger();;
7が発行されました
val it : unit = ()
 
それでは、ひとつsubscriber役のオブジェクトを作成してみて、handlerを仲介役としてそれに通知してみます。
 
type myTestObj () =
    member this.SomethingRecieved (n:int) =
        printfn "テストオブジェクトが%dを受け取りました" n
 
インスタンスを作ります。
let testObj = new myTestObj()
 
仲介役のhandlerを登録します。
関数の本体はtestObjのSomethingRecievedメソッドの呼び出しです。
pub.AddMyHandler(fun n -> testObj.SomethingRecieved(n))
 
> pub.Trigger();;
テストオブジェクトが7を受け取りました
val it : unit = ()
 
 
こ「の関数を仲介にする」という部分の関数の代わりにデリゲートを用いて、ライブラリ化したものが、.NETのEvent関連の部分になります。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。