スポンサーサイト

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

F#によるデザインパターン入門 テンプレートパターン(2)

まずは前回の復習です。
テンプレートパターンというのは、派生元クラスで工程の分け方と、その組み合わせ方を定め、派生先クラスで、各工程の具体的内容を定めるようなパターンでした。
 
今回はこのような振る舞いを別の形で表してみたいと思います。
前回では、派生元クラスで組み合わせの実装をし、派生先クラスで個々の工程の内容を定めていましたが、今回はクラスの継承関係を使わず、一つのクラスで組み合わせの実装をし、個々のインスタンスで個々の工程の内容を定めてみます。
まず、次のようなクラスを定義します。
 
type ReportMaker(title,contentsLst,f_top,f_middle,f_end) =
    member this.makeUpReport () =
        (f_top title) + (f_middle contentsLst) + (f_end ()) //文字の連結
 
 それでは、まずは普通のレポートを返すインスタンスを生成してみます。
 
let plainReportMaker =
    new ReportMaker("今日の料理",["卵焼き";"鮭";"漬物"],
                     (fun s -> s + "\n"), 
                     (fun sLst -> List.fold (fun s ele -> s + ele + "\n") "" sLst),
                     (fun () -> "以上" ))
 
ここまでをF#Interactiveに食わせてみます。
 
type ReportMaker =
  class
    new : title:string * contentsLst:string list * f_top:(string -> string) *
          f_middle:(string list -> string) * f_end:(unit -> string) ->
            ReportMaker
    member makeUpReport : unit -> string
  end
val plainReportMaker : ReportMaker
 
コンストラクタで、タイトルと内容および、個々の工程を表す関数を与えていることに留意してください。
 
使ってみます。
> printfn "%s" (plainReportMaker.makeUpReport());;
今日の料理
卵焼き

漬物
以上
val it : unit = ()
 
少し装飾を加えたレポートを返すインスタンスを生成させてみます。
 
> let decReportMaker =
     new ReportMaker("今日の料理",["卵焼き";"鮭";"漬物"],
                     (fun s -> "--------- " + s + " -----------\n"), 
                     (fun sLst -> List.fold (fun s ele -> s + "○" + ele + "\n") "" sLst),
                     (fun () -> "-----------以上-----------------" ));;
 
val decReportMaker : ReportMaker
 
使ってみます。
> printfn "%s" (decReportMaker.makeUpReport());;
--------- 今日の料理 -----------
○卵焼き
○鮭
○漬物
-----------以上-----------------
val it : unit = ()
 
上の実装では、コンストラクタで全て決まり、内容は後で変更不可でしたので、次はタイトルと内容以外は変更可能にしてみます。
 
クラス定義を次のように直します。
 
type ReportMaker(title,contentsLst,in_f_top,in_f_middle,in_f_bottom) =
    let mutable f_top = in_f_top
    let mutable f_middle = in_f_middle
    let mutable f_bottom = in_f_bottom
 
    member this.TopFunc
        with set(f) = f_top <- f
    member this.MiddleFunc
        with set(f) = f_middle <- f
    member this.BottmFunc
        with set(f) = f_bottom <- f
 
    member this.makeUpReport () =
        (f_top title) + (f_middle contentsLst) + (f_bottom ()) //文字の連結
 
シグネチャーは次のようになります。
 
type ReportMaker =
  class
    new : title:string * contentsLst:string list * in_f_top:(string -> string) *
          in_f_middle:(string list -> string) * in_f_bottom:(unit -> string) ->
            ReportMaker
    member makeUpReport : unit -> string
    member BottmFunc : (unit -> string) with set
    member MiddleFunc : (string list -> string) with set
    member TopFunc : (string -> string) with set
  end
 
普通のレポートを返すインスタンスを生成してみます。
 
let plainReportMaker =
    new ReportMaker("今日の料理",["卵焼き";"鮭";"漬物"],
                     (fun s -> s + "\n"), 
                     (fun sLst -> List.fold (fun s ele -> s + ele + "\n") "" sLst),
                     (fun () -> "以上" ))
 
使用してみます。
> printfn "%s" (plainReportMaker.makeUpReport());;
今日の料理
卵焼き

漬物
以上
val it : unit = ()
 
タイトル部分の表示工程を担当する関数だけ変更してみます。
 
> plainReportMaker.TopFunc <- (fun s -> "--------- " + s + " -----------\n");;
val it : unit = ()
 
> printfn "%s" (plainReportMaker.makeUpReport());;
--------- 今日の料理 -----------
卵焼き

漬物
以上
val it : unit = ()
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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