デコレーターパターンの定義
元のクラスファイルを変更したり継承を使用したりせずに、オブジェクトの機能を動的に拡張します。ラッピングオブジェクト、つまり装飾を作成することで、実際のオブジェクトをラッピングします。
デコレータパターンは、装飾する各関数を別のクラスに配置し、このクラスで装飾したいオブジェクトをラップできるようにするため、特別な動作を実行する必要がある場合、クライアントコードは実行時に必要に応じて装飾関数を持つことができます。オブジェクトを選択的かつ順次にラップするために使用されます。
写真1
使用シナリオ
さまざまな機会に応じて異なる服装の生徒を作成する必要がある場合を想像してください。たとえば、学校では生徒は制服を着用する必要があり、プロムでは生徒はフォーマルな服を着用する必要があり、家では生徒は裸の服を着ても構いません (少し変態的です)。もちろん、スーパーマンから学んで、外で下着を着用することもできます。この時点で、機会ごとに異なる服装の学生クラスを作成する必要があるのかという疑問が生じます。もしうちの子供が、制服のパンツを着て、お尻が露出したドレストップを着ている女の子を望んでいたらどうしますか? StudentWithSchoolUniform、StudentWithFormalWear、StudentWithNaked、StudentWithSchoolUniformAndOutSideUnderWear.... 終わりのない授業~~~疲れた!確かに、これによってクラスが爆発的に増え、需要が増えるとクラスは増え続け、システム全体のメンテナンスが困難になることは想像できます。
したがって、現時点では、デコレータ モードがその役割を果たすことができます。下着、フォーマルウェア、学校の制服、靴、メガネなどはすべて、特定のデコレータであり、装飾されたオブジェクトは の抽象クラスです。デコレータはすべて同じ親クラスから継承します。生徒に別の服を着せることは、実際には装飾されたクラス(生徒)を包むためにデコレータークラス(衣服)を使用することであり、比喩的に言えば、これはドレスアッププロセスです。
クラスとインターフェース
例
写真2
パーソン.php
1 php 2 3 /** 4 * person.php 5 * 装飾された基本クラス 6 **/ 7 要約 クラス 人{ 8 9 公開 要約 関数 show(); 10 11 } コードを表示Student.php
1 php 2 3 /** 4 * Student.php 5 * 特定の装飾されたオブジェクト 6 **/ 7 クラス 生徒 延長 人{ 8 9 プライベート $name; 10 11 パブリック function __construct($name){ 12 $this->名前 = $name; 13 } 14 15 パブリック 関数 show(){ 16 エコー「私は学生です」、$this->名前; 17 } 18 } コードを表示コスチューム.php
1 php 2 3 /** 4 * コスチューム.php 5 * デコレータ基本クラス 6 **/ 7 要約 クラス コスチューム 拡張 人{ 8 9 10 } コードを表示シャツ.php
1 php 2 3 /** 4 * Shirt.php 5 * 特定のデコレータクラス 6 **/ 7 クラス シャツ拡張 コスチューム{ 8 9 プライベート $人; 10 11 public function __construct(人$人){ 12 13 $this->人 = $人; 14 15 } 16 17 public function show(){ 18 19 エコー $this->person->show(),',シャツを着ています'; 20 } 21 22 } コードを表示パンツ.php
1 php 2 3 /** 4 * パンツ.php 5 **/ 6 クラス パンツ 延長 コスチューム{ 7 8 プライベート $人; 9 10 public function __construct(person $person){ 11 12 $this->人 = $人; 13 14 } 15 16 public function show(){ 17 18 エコー $this->person->show(),',パンツを履いてます'; 19 } 20 21 } コードを表示Glasses.php
1 php 2 3 /** 4 * Glasses.php 5 **/ 6 クラス メガネ 延長 コスチューム{ 7 8 プライベート $人; 9 10 public function __construct(person $person){ 11 12 $this->人 = $人; 13 14 } 15 16 public function show(){ 17 18 エコー $this->person->show(),',メガネ付き'; 19 } 20 21 } コードを表示UnderWear.php
1 php 2 3 /** 4 * UnderWear.php 5 **/ 6 クラス 下着 拡張 コスチューム{ 7 8 プライベート $人; 9 10 public function __construct(person $person){ 11 12 $this->人 = $人; 13 14 } 15 16 public function show(){ 17 18 echo $this->person->show(),',DKを着ています; 19 } 20 21 } コードを表示Client.php
リーリー図 3 出力結果のスクリーンショット
Symfony2 EventDispatch コンポーネントのデコレータ パターンのアプリケーション
図 4 Symfony2 EventDispatch コンポーネントはデコレーション モードを使用します
図5 フレームワーク構成 EventDispatcher
特定のデコレータ オブジェクト SymfonyComponentHttpKernelDebugTraceableEventDispatcher::dispatch() メソッド、コアはまだ装飾された特定のオブジェクト SymfonyComponentEventDispatcherEventDispatcher::dispatch() メソッドを呼び出して機能しますが、デコレータ オブジェクト SymfonyComponentHttpKernelDebugTraceableEventDispatcher::dispatch() メソッドは、次のような対応する関数を追加します。以前と同様にSymfonyComponentEventDispatcherEventDispatcher::dispatch() メソッドを呼び出した後、preProcess()、preDispatch()、postDispatch()、postProcess() がそれぞれ呼び出されました:
リーリー
利点
デメリット