Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターン_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:12:58
オリジナル
898 人が閲覧しました

Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターン

デコレーターパターンの定義

元のクラスファイルを変更したり継承を使用したりせずに、オブジェクトの機能を動的に拡張します。ラッピングオブジェクト、つまり装飾を作成することで、実際のオブジェクトをラッピングします。

デコレータパターンは、装飾する各関数を別のクラスに配置し、このクラスで装飾したいオブジェクトをラップできるようにするため、特別な動作を実行する必要がある場合、クライアントコードは実行時に必要に応じて装飾関数を持つことができます。オブジェクトを選択的かつ順次にラップするために使用されます。

Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターン_PHP チュートリアル写真1

使用シナリオ

さまざまな機会に応じて異なる服装の生徒を作成する必要がある場合を想像してください。たとえば、学校では生徒は制服を着用する必要があり、プロムでは生徒はフォーマルな服を着用する必要があり、家では生徒は裸の服を着ても構いません (少し変態的です)。もちろん、スーパーマンから学んで、外で下着を着用することもできます。この時点で、機会ごとに異なる服装の学生クラスを作成する必要があるのか​​という疑問が生じます。もしうちの子供が、制服のパンツを着て、お尻が露出したドレストップを着ている女の子を望んでいたらどうしますか? StudentWithSchoolUniform、StudentWithFormalWear、StudentWithNaked、StudentWithSchoolUniformAndOutSideUnderWear.... 終わりのない授業~~~疲れた!確かに、これによってクラスが爆発的に増え、需要が増えるとクラスは増え続け、システム全体のメンテナンスが困難になることは想像できます。

したがって、現時点では、デコレータ モードがその役割を果たすことができます。下着、フォーマルウェア、学校の制服、靴、メガネなどはすべて、特定のデコレータであり、装飾されたオブジェクトは の抽象クラスです。デコレータはすべて同じ親クラスから継承します。生徒に別の服を着せることは、実際には装飾されたクラス(生徒)を包むためにデコレータークラス(衣服)を使用することであり、比喩的に言えば、これはドレスアッププロセスです。

クラスとインターフェース

  • コンポーネント (装飾されたオブジェクトの基本クラス、例の Person クラスに対応)
  • ConcreteComponent (例の Student クラスに対応する、特定の装飾されたオブジェクト)
  • Decorator(デコレータ基本クラス、例に対応するコスチューム)
  • ContreteDecorator (特定のデコレータークラス、対応するパンツ、シャツなどの例)

Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターン_PHP チュートリアル写真2

パーソン.php

Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターン_PHP チュートリアル 1 php 2 3 /** 4 * person.php 5 * 装飾された基本クラス 6 **/ 7 要約 クラス 人{ 8 9 公開 要約 関数 show(); 10 11 } コードを表示

Student.php

Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターン_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

Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターン_PHP チュートリアル 1 php 2 3 /** 4 * コスチューム.php 5 * デコレータ基本クラス 6 **/ 7 要約 クラス コスチューム 拡張 人{ 8 9 10 } コードを表示

シャツ.php

Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターン_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

Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターン_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

Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターン_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

Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターン_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

リーリー

Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターン_PHP チュートリアル図 3 出力結果のスクリーンショット

Symfony2 EventDispatch コンポーネントのデコレータ パターンのアプリケーション

Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターン_PHP チュートリアル図 4 Symfony2 EventDispatch コンポーネントはデコレーション モードを使用します

図5 フレームワーク構成 EventDispatcher

  • SymfonyComponentEventDispatcherEventDispatcherInterface は装飾されたインターフェイスです
  • SymfonyComponentEventDispatcherEventDispatcher と SymfonyComponentEventDispatcherContainerAwareEventDispatcher は、装飾される特定のオブジェクトです
  • SymfonyComponentEventDispatcherDebugTraceableEventDispatcherInterface デコレータ インターフェイス
  • SymfonyComponentEventDispatcherDebugTraceableEventDispatcher デコレータ基本クラス
  • SymfonyComponentHttpKernelDebugTraceableEventDispatcher 固有のデコレーター オブジェクト

特定のデコレータ オブジェクト SymfonyComponentHttpKernelDebugTraceableEventDispatcher::dispatch() メソッド、コアはまだ装飾された特定のオブジェクト SymfonyComponentEventDispatcherEventDispatcher::dispatch() メソッドを呼び出して機能しますが、デコレータ オブジェクト SymfonyComponentHttpKernelDebugTraceableEventDispatcher::dispatch() メソッドは、次のような対応する関数を追加します。以前と同様にSymfonyComponentEventDispatcherEventDispatcher::dispatch() メソッドを呼び出した後、preProcess()、preDispatch()、postDispatch()、postProcess() がそれぞれ呼び出されました:

リーリー

利点

デメリット

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/918062.html技術記事 Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターンのデコレーターパターンの定義は、元のクラスファイルを変更せず、継承を使用せずにオブジェクトを動的に拡張します...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!