Decorator(ちょうぜつ本)
既存メソッドの振る舞いはそのままにし、新たなメソッドを追加する拡張ラッパー (Kindle版 p.380)
DrawingInterface
線分を引ける(最小限)
startAt
lineTo
DrawingInterfaceを実装したDecorativeDrawing
DrawingInterfaceを実装したクラスのインスタンスを持つ
DrawingInterfaceを実装したクラスが何個あってもDecorativeDrawingは1つで済む!
startAtとlineToは委譲する実装
startAtとlineToを使って、四角形や三角形を描画するメソッドを追加
Decoratorパターンは継承よりはるかに柔軟
委譲を使ったメソッド追加により、上で述べた1つで済む点
継承だと実装ごとにクラスが増える経験をした
実行時に拡張される
もしかするとトークナイザの実装で見たことあるかも
ちょっとさみしい機能に皮をかぶせて、透過的にリッチな振る舞いを得られるようにするのが Decorator パターンです。
もとのインスタンスはそのままでオッケー。
Python の文法には、関数にかぶせて振る舞いを拡張するデコレーターがありますが、まさにそれが、関数というオブジェクト に対する Decorator です。
Decorator は「右と左の端子がすでにかみ合っているところに、それと同じ形の端子を付けた装置を割り込ませる」ラッパー。