本は言う:
デコレータ パターンは、特定のオブジェクトの機能を拡張 (装飾) するために使用できます。
私はウサギの動物を飼っています。そして、ウサギに爬虫類の皮膚を持たせたいと思っています。普通のうさぎを爬虫類の皮で飾りたいだけです。
私はコードを持っています。まずAnimal
、すべての動物に共通するすべての抽象クラスがあります。
abstract class Animal {
abstract public function setSleep($hours);
abstract public function setEat($food);
abstract public function getSkinType();
/* and more methods which for sure will be implemented in any concrete animal */
}
ウサギのクラスを作成します。
class Rabbit extends Animal {
private $rest;
private $stomach;
private $skinType = "hair";
public function setSleep($hours) {
$this->rest = $hours;
}
public function setFood($food) {
$this->stomach = $food;
}
public function getSkinType() {
return $this->$skinType;
}
}
これまでのところ、すべて問題ありません。次に、拡張する抽象AnimalDecorator
クラスを作成しAnimal
ます。
abstract class AnimalDecorator extends Animal {
protected $animal;
public function __construct(Animal $animal) {
$this->animal = $animal;
}
}
そして、ここで問題が発生します。AnimalDecorator
クラスからすべての抽象メソッドも取得することに注意してAnimal
ください (この例では 2 つだけですが、実際にはもっと多くのメソッドを持つことができます)。
ReptileSkinDecorator
次に、拡張する具象クラスを作成しますAnimalDecorator
。からの同じ 2 つの抽象メソッドもありますAnimal
。
class ReptileSkinDecorator extends AnimalDecorator {
public function getSkinColor() {
$skin = $this->animal->getSkinType();
$skin = "reptile";
return $skin;
}
}
最後に、ウサギを爬虫類の皮で飾りたいと思います。
$reptileSkinRabbit = ReptileSkinDecorator(new Rabbit());
ReptileSkinDecorator
しかし、クラスに2つの抽象メソッドがあるため、これを行うことはできません. 彼らです:
abstract public function setSleep($hours);
abstract public function setEat($food);
そのため、スキンだけを再装飾するだけでなくsetSleep()
、setEat();
メソッドも再装飾する必要があります。しかし、私はする必要はありません。
Animal
すべての本の例では、クラスには常に 1 つの抽象メソッドしかありません。そしてもちろん、それは機能します。しかし、ここでは非常に単純な実際の例を作成し、Decorator パターンを使用しようとしましたが、これらの抽象メソッドをReptileSkinDecorator
クラスに実装しないと機能しません。
私の例を使用したい場合は、新しいウサギを作成し、独自のメソッドを実装する必要があることを意味しsetSleep()
ますsetEat()
。OK、そうしましょう。しかし、この真新しいうさぎには、Rabbit
私が渡したcommont のインスタンスがありReptileSkinDecorator
ます。
$reptileSkinRabbit = ReptileSkinDecorator(new Rabbit());
reptileSkinRabbit インスタンスには、独自の reptileSkinRabbit メソッドを持つ共通のウサギ インスタンスが 1 つあります。うさぎにはうさぎがいます。しかし、私はそのような可能性を持つ必要はないと思います。
Decarator パターンが正しく理解できません。このパターンの理解において、私の例の間違いを指摘してください。
ありがとうございました。