スポンサーサイト

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

F#によるデザインパターン入門 Proxy パターン(1)

まずは政治家とその秘書を想像してください。
政治家に何か用件を頼むときは、まず普通は秘書に連絡します。
秘書は内容によって、政治家に連絡を取ります。(とらない場合もあり得ます。)
 
このように、あるオブジェクト(上の場合政治家)への呼び出しを、直接するのではなく、代理のオブジェクト(上の場合秘書)を窓口におこなうようなパターンをProxy(プロキシー,代理)パターンといいます。ここでは3種類のProxy(代理)パターンの利用方法を順次紹介していきたいとおもいます。
 
一つ目は秘書が用件を政治家に伝えたり伝えなかったりする(つまりアクセスを制御する)例です。
 
まずはオブジェクトへの要請(オブジェクトの持つべきメソッド)をインターフェイスで定義しておきます。
 
> type IWhatToDo  =
    abstract do_something1 : unit -> unit
    abstract do_something2 : int -> unit;;
 
type IWhatToDo =
  interface
    abstract member do_something1 : unit -> unit
    abstract member do_something2 : int -> unit
  end
 
次は政治家オブジェクトの定義です。
 
> type MyRealPlayer () =
    interface IWhatToDo with
      member this.do_something1 ()=
                printfn "RealPlayer do something1"
      member  this.do_something2 i =
                printfn "RealPlayer do something2 with i = %d" i;;
 
type MyRealPlayer =
  class
    interface IWhatToDo
    new : unit -> MyRealPlayer
  end
  
次に秘書オブジェクトの定義です。
 
> type MyProxyPlayer (rp : MyRealPlayer) =
    interface IWhatToDo with
      member this.do_something1 () =
                (rp:>IWhatToDo).do_something1 ()
      member this.do_something2 i =
                if i >=10000 then
                   (rp:>IWhatToDo).do_something2 i
                else
                    ();;
 
type MyProxyPlayer =
  class
    interface IWhatToDo
    new : rp:MyRealPlayer -> MyProxyPlayer
  end
  
暗黙的クラス定義なので少しわかりにくいかもしれませんが、コンストラクタで政治家オブジェクトを渡すようにしているので、秘書オブジェクトは暗黙裡に政治家オブジェクトへの参照を持つことになります。
(政治家オブジェクトのほうをサブジェクト(subject)というそうです。)
 
では使ってみます。
 
> let myRealP = new MyRealPlayer()
let myProxyP = new MyProxyPlayer(myRealP);;
 
val myRealP : MyRealPlayer
val myProxyP : MyProxyPlayer
 
proxy経由でdo_something1を呼び出す
 
> (myProxyP:>IWhatToDo).do_something1();;
RealPlayer do something1
val it : unit = ()
 
proxy経由でdo_something2を呼び出す(myRealPへのアクセスが拒否される場合)
 
> (myProxyP:>IWhatToDo).do_something2(100);;
val it : unit = ()
 
proxy経由でdo_something2を呼び出す(myRealPへのアクセスが許可される場合)
 
> (myProxyP:>IWhatToDo).do_something2(100000);;
RealPlayer do something2 with i = 100000
val it : unit = ()
 
このように、本物のオブジェクトと用件の間に入って、アクセスの制限をつかさどるProxyを防御proxy(protection proxy)といいます。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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