2006-09-10

Ioでデザインパターン - Singleton,Decorator

Ioの勉強のためにGoFのデザインパターンを書いてみることにしました。今回はSingletonパターンDecoratorパターン

Ioのサンプルコードのページを見てみるとSingletonパターンのコードがあります。
プロトタイプベース言語のせいか超シンプル。

Foo := Object clone
Foo clone := Foo



それで他のデザインパターンをIoで書いたらどうなんのかなー,ということでやってみることにしました。
まずはDecorator。そんなに使ったことないけど,何となく好きなパターン。以下のコードでは文字列を出力する処理をデコレートして,"-"とか"[]"とかで前後から挟むようにしてみました。

Component := Object clone do(
printString := method(str, str println)
)

Decorator := Component clone do(
component := Component
printString := method(str,
component printString(str)
)
)

// add "[]"
BracketDecorator := Decorator clone do(
printString := method(str,
str = "[" .. str .. "]"
component printString(str)
)
)

// add "--"
DashDecorator := Decorator clone do(
printString := method(str,
str = "-" .. str .. "-"
component printString(str)
)
)

// インスタンス作成
comp := Component clone
bd := BracketDecorator clone
dd := DashDecorator clone

dd component = comp
bd component = dd

writeln(">> Bracket -> Dash")
bd printString("Decorator")
// "-[Decorator]-"と表示される


こんな感じで良いのかな? 本当はDecoratorの派生クラスの場合は"component printString()"じゃなくて,"self proto printString()"という書き方をやんなきゃいけないんだけど(componentとDecoratorの仕組みをカプセル化するため),それだと何故か上手くいかなかった。ComponentのprintString()まで処理がいかないみたいで。


まぁ,こんな感じでGoFのデザインパターンをIoで書いてこうかと思います。



【参考リンク】
デザインパターン[モデリング] -TECHSCORE-
 デザパタの元ネタはここを参考にさせてもらってます。
i d e a * i d e a - ブログにコードを貼り付ける方法で悩むの巻
 ここで紹介されてる方法を使ってコードを貼り付けてみました

0 件のコメント: