kakke18’s blog

ゆるふわ学生エンジニア

Decorator-飾り枠と中身の同一視-

Java言語で学ぶデザインパターン入門 の第12章を参考にしました。

Decoratorパターンとは

本書には以下のように記載されています。

オブジェクトにどんどんデコレーションを施していくようなデザインパターン

ここでいう”デコレーション”とは、プログラムでいうと”機能”のことです。 つまり、Decoratorパターンとは、機能を一皮一皮被せていって、より目的となるオブジェクトを仕上げるデザインパターンです。

これは、前回の記事 で紹介したCompositeパターンのように中身と飾り枠(機能)を同一視することによって実現しています。

実装

こちらを参考にしてください。

登場人物

  • Component役(Displayクラス)

    機能を追加するときの核であり、APIを定義する

  • ConcreteComposite役(StringDisplayクラス)

    Component役で定義されたAPIを実装する

  • Decorator役(Borderクラス)

    Component役と同じAPIを持ち、自身が飾る対象であるComponent役を保持する。

  • ConcreteDecorator役(SideBorderクラス、FullBorderクラス)

    Decorator役で定義されたAPIを実装する

実装のポイント

個人的には、Displayクラスを継承したBorderクラスでは、Displayクラスの各メソッドを実装せず、 Borderクラスを継承したSideBorderクラスやFullBorderクラスでDisplayクラスの各メソッドを実装している点が ポイントかなと思いました。

Decoratorパターンのメリット

中身を変えずに機能を追加することができる

飾り枠を追加すればするほど機能が追加されます。 サンプルプログラムでは、SideBorderやFullBorderで包めば包むほどたくさん装飾されます。 これは、包まれる側(中身)を全く変更することなく、機能の追加をすることができることを表しています。

単純な品揃えでも、多様な機能を追加することができる

Decoratorパターンを使うと、ConcreteDecoratorをたくさん用意してだけで、 それらを自由に組み合わせて新しいオブジェクトを作成することができます。

まとめ

Decoratorパターンを使うと、透過的なAPIを保ったまま機能を追加することが可能。