LoginSignup
4
4

More than 5 years have passed since last update.

PHPで使うGoFパターン ひとり Advent Calendar - デコレーター

Last updated at Posted at 2012-07-31

デコレーターってなに?

要約するとタマネギです。
オニオンパターンとかで覚えておくと良いと思います。

デコレーターの構造

  • 玉葱の芯
  • 玉葱の皮
<?php

class Inner {
  public function __construct () {
  }
  public function getName () {
     return __CLASS__;
  }
}

class Outer extends Inner {
  protected $_Inner = null;
  public function __construct ( $obj ) {
    $this->_Inner = $obj;
  }

  public function getName () {
    $name = $this->_Inner->getName();
    return $name . ' in Outer';
  }
}

class OuterOfOuter extends Outer {
  protected $_Inner = null;
  public function __construct ( $obj ) {
    $this->_Inner = $obj;
  }
  public function getName () {
    $name = $this->_Inner->getName();
    return $name . ' in OuterOfOuter';
  }
}

class SuperOuterOfOuter extends OuterOfOuter {
  protected $_Inner = null;
  public function __construct ( $obj ) {
    $this->_Inner = $obj;
  }
  public function getName () {
    $name = $this->_Inner->getName();
    return $name . ' in SuperOuterOfOuter';
  }
}

$obj = new OuterOfOuter ( new Outer ( new Inner () ) );
print $obj->getName() . "\n";

$obj = new SuperOuterOfOuter ( new OuterOfOuter ( new Inner () ) );
print $obj->getName() . "\n";

デコレータパターン

のように、集約と汎化の良いところどりで、実に柔軟にメソッドを拡張できるパターンですが、
やり過ぎると実にカオスになって手に負えなくなる諸刃の剣なパターンでもあります。
※ 例を実際的な例ではなくてサンプルコード的なサンプルコードにしたのも、それを伝え易くしたかったためです。

上手く使うと既存システムをユニットテストに組み込む時にも役に立つので、
ご利用は計画的に。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4