Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターン
デコレーターパターンの定義
元のクラスファイルを変更したり継承を使用したりせずに、オブジェクトの機能を動的に拡張します。ラッピングオブジェクト、つまり装飾を作成することで、実際のオブジェクトをラッピングします。
デコレータパターンは、装飾する各関数を別のクラスに配置し、このクラスで装飾したいオブジェクトをラップできるようにするため、特別な動作を実行する必要がある場合、クライアントコードは実行時に必要に応じて装飾関数を持つことができます。オブジェクトを選択的かつ順次にラップするために使用されます。
写真1
使用シナリオ
さまざまな機会に応じて異なる服装の生徒を作成する必要がある場合を想像してください。たとえば、学校では生徒は制服を着用する必要があり、プロムでは生徒はフォーマルな服を着用する必要があり、家では生徒は裸の服を着ても構いません (少し変態的です)。もちろん、スーパーマンから学んで、外で下着を着用することもできます。この時点で、機会ごとに異なる服装の学生クラスを作成する必要があるのかという疑問が生じます。もしうちの子供が、制服のパンツを着て、お尻が露出したドレストップを着ている女の子を望んでいたらどうしますか? StudentWithSchoolUniform、StudentWithFormalWear、StudentWithNaked、StudentWithSchoolUniformAndOutSideUnderWear.... 終わりのない授業~~~疲れた!確かに、これによってクラスが爆発的に増え、需要が増えるとクラスは増え続け、システム全体のメンテナンスが困難になることは想像できます。
したがって、現時点では、デコレータ モードがその役割を果たすことができます。下着、フォーマルウェア、学校の制服、靴、メガネなどはすべて、特定のデコレータであり、装飾されたオブジェクトは の抽象クラスです。デコレータはすべて同じ親クラスから継承します。生徒に別の服を着せることは、実際には装飾されたクラス(生徒)を包むためにデコレータークラス(衣服)を使用することであり、比喩的に言えば、これはドレスアッププロセスです。
クラスとインターフェース
- コンポーネント (装飾されたオブジェクトの基本クラス、例の Person クラスに対応)
- ConcreteComponent (例の Student クラスに対応する、特定の装飾されたオブジェクト)
- Decorator(デコレータ基本クラス、例に対応するコスチューム)
- ContreteDecorator (特定のデコレータークラス、対応するパンツ、シャツなどの例)
例
写真2
パーソン.php
![](http://www.bkjia.com/uploads/allimg/141127/163K232H-0.gif)
1 php
2
3 /**
4 * person.php
5 * 装飾された基本クラス
6 **/
7 要約 クラス 人{
8
9 公開 要約 関数 show();
10
11 }
コードを表示
Student.php
![](http://www.bkjia.com/uploads/allimg/141127/163K232H-0.gif)
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
![](http://www.bkjia.com/uploads/allimg/141127/163K232H-0.gif)
1 php
2
3 /**
4 * コスチューム.php
5 * デコレータ基本クラス
6 **/
7 要約 クラス コスチューム
拡張 人{
8
9
10 }
コードを表示
シャツ.php
![](http://www.bkjia.com/uploads/allimg/141127/163K232H-0.gif)
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
![](http://www.bkjia.com/uploads/allimg/141127/163K232H-0.gif)
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
![](http://www.bkjia.com/uploads/allimg/141127/163K232H-0.gif)
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
![](http://www.bkjia.com/uploads/allimg/141127/163K232H-0.gif)
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 コンポーネントはデコレーション モードを使用します
![](http://www.bkjia.com/uploads/allimg/141127/163K22524-7.png)
図5 フレームワーク構成 EventDispatcher
- SymfonyComponentEventDispatcherEventDispatcherInterface は装飾されたインターフェイスです
- SymfonyComponentEventDispatcherEventDispatcher と SymfonyComponentEventDispatcherContainerAwareEventDispatcher は、装飾される特定のオブジェクトです
- SymfonyComponentEventDispatcherDebugTraceableEventDispatcherInterface デコレータ インターフェイス
- SymfonyComponentEventDispatcherDebugTraceableEventDispatcher デコレータ基本クラス
- SymfonyComponentHttpKernelDebugTraceableEventDispatcher 固有のデコレーター オブジェクト
特定のデコレータ オブジェクト SymfonyComponentHttpKernelDebugTraceableEventDispatcher::dispatch() メソッド、コアはまだ装飾された特定のオブジェクト SymfonyComponentEventDispatcherEventDispatcher::dispatch() メソッドを呼び出して機能しますが、デコレータ オブジェクト SymfonyComponentHttpKernelDebugTraceableEventDispatcher::dispatch() メソッドは、次のような対応する関数を追加します。以前と同様にSymfonyComponentEventDispatcherEventDispatcher::dispatch() メソッドを呼び出した後、preProcess()、preDispatch()、postDispatch()、postProcess() がそれぞれ呼び出されました:
リーリー
利点
デメリット
http://www.bkjia.com/PHPjc/918062.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/918062.html技術記事 Symfony2 のデザインパターン - デコレーターパターン、symfony2 デザインパターンのデコレーターパターンの定義は、元のクラスファイルを変更せず、継承を使用せずにオブジェクトを動的に拡張します...