GoFのデザインパターン3回目

濱田です。
デコレーションメール通称デコメが一般的になりましたが、このデコメってサイトから画像を落とすだけでいろんなパターンのメールをデザインする事が出来ますよね。

デコレーションって名前しか一致しないんですが、GoFのデザインパターンにもデコレーションパターンと言って機能を拡張する事を目的としたデザインパターンがあります。

■目的
既存のクラスが実現(implements)しているインターフェースを変更することなく機能拡張を行いたい

■背景
機能を追加する場合はよく拡張元のクラスを継承してサブクラス内で機能を拡張しますが、この方法だとサブクラスとスーパークラスの関係は固定されてしまいます。
しかし、拡張したクラスが汎用性が高く違うクラスの拡張として使いたい場合はスーパークラスが固定されているので新たにサブクラスを定義する必要が出てきます。
汎用性が高いのであれば今後も使える可能性が高いので動的に拡張元のクラスを変えられるようにしたい。

ではソースを見てみましょう。


interface MyClass {
  String getName();
}
//拡張元のクラス
class A1 implements MyClass{
  private String name = "海原 才人";
  public void setName(String n){
    name = n;
  }
  public String getName(){
    return name;
  }
}
//拡張クラス
class Decorator implements MyClass{
  private MyClass obj;
  Decorator(MyClass o){
    obj = o;
  }
  public String getName(){
    return "設定された名前は " + obj.getName() + "です";
  }
}
class Sample{
  public static void main(String aaa){
    A1 objA = new A1();
    objA.setName("海原 才人");
    System.out.println("拡張前");
    System.out.println(objA.getName());
    System.out.println("拡張後");
    MyClass objDecorator = new Decorator(objA);
    System.out.println(objDecorator.getName());
  }
}

実行結果


D:\src\java_work\Decorator>java Sample
拡張前
海原 才人
拡張後
設定された名前は 海原 才人です

Decoratorクラスのコンストラクターで拡張元のオブジェクトを渡す事によって拡張元の機能を拡張しています。

こんなクラス設計の考え方もあるのでぜひ応用して使ってみてはどうでしょう?