デコレーターってなに?
要約するとタマネギです。
オニオンパターンとかで覚えておくと良いと思います。
デコレーターの構造
- 玉葱の芯
- 玉葱の皮
<?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";
デコレータパターン
のように、集約と汎化の良いところどりで、実に柔軟にメソッドを拡張できるパターンですが、
やり過ぎると実にカオスになって手に負えなくなる諸刃の剣なパターンでもあります。
※ 例を実際的な例ではなくてサンプルコード的なサンプルコードにしたのも、それを伝え易くしたかったためです。
上手く使うと既存システムをユニットテストに組み込む時にも役に立つので、
ご利用は計画的に。