麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

Symfony2中的設計模式——裝飾者模式

2019-11-15 01:57:12
字體:
來源:轉載
供稿:網友
Symfony2中的設計模式——裝飾者模式

裝飾者模式的定義

  文章鏈接:http://www.hcoding.com/?p=101

  個人站點:http://www.hcoding.com/

  在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。

  裝飾者模式把每個要裝飾的功能放在單獨的類中,并讓這個類包裝它要裝飾的對象,因此,當需要執行特殊行為時,客戶端代碼就可以在運行的時候根據需要有選擇地、按順序地使用裝飾功能包裝對象了。

裝飾者模式

圖1

使用場景

  設想一下,如果我們需要創建一個在不同場合有不同著裝的學生,例如:在學校學生需要穿上校服,在舞會學生需要穿上正裝,在家學生可以裸裝(有點變態),當然,還可以學習超人把底褲穿在外面。這時候問題來了,難道我們要為每種場合編寫一個不同穿著的學生類嗎?如果我們的童鞋想要一個穿著校服褲子、正裝上衣外露的底褲怎么辦?StudentWithSchoolUniform、StudentWithFormalWear、StudentWithNaked、StudentWithSchoolUniformAndOutSideUnderWear..................綿綿無盡的類~~~累!是的,如果這樣就造成類爆炸了,需求增加,類就不斷的增加,整個系統的維護難度可想而知。

  所以這時候,裝飾者模式就可以發揮它的作用了,底褲、正裝、校服、鞋子、眼鏡等等都是具體的裝飾者,學生是具體的被裝飾的對象,被裝飾的對象和裝飾者的抽象類都繼承者同一個父類。為學生穿上不同的服裝,其實就是使用裝飾者類(服裝)包裹被裝飾者類(學生),形象的說這是一個穿衣的過程。

類和接口

  • Component(被裝飾對象基類,對應例子的Person類)
  • ConcreteComponent(具體被裝飾對象,對應例子的Student類)
  • Decorator(裝飾者基類,對應例子的Costume)
  • ContreteDecorator(具體的裝飾者類,對應例子的Pants、Shirt等)

例子

圖2

Person.php

 1 <?php 2  3 /** 4 *    Person.php 5 *   被裝飾基類 6 **/ 7     abstract class Person{ 8  9         public abstract function show();10 11     }
View Code

Student.php

 1 <?php 2  3 /** 4 *    Student.php 5 *    具體被裝飾對象 6 **/ 7     class Student extends Person{ 8  9         PRivate $name;10 11         public function __construct($name){12             $this->name = $name;13         }14 15         public function show(){16             echo '我是學生',$this->name;17         }18     }
View Code

Costume.php

 1 <?php 2  3 /** 4 *    Costume.php 5 *    裝飾者基類 6 **/ 7     abstract class Costume extends Person{ 8      9 10     }
View Code

Shirt.php

 1 <?php 2  3 /** 4 *    Shirt.php 5 *    具體的裝飾者類 6 **/ 7     class Shirt extends Costume{ 8  9         private $person;10 11         public function __construct(Person $person){12 13             $this->person = $person;14 15         }16 17         public function show(){18 19             echo $this->person->show(),',穿著襯衫';20         }21 22     }
View Code

Pants.php

 1 <?php 2  3 /** 4 *    Pants.php 5 **/ 6     class Pants extends Costume{ 7  8         private $person; 9 10         public function __construct(Person $person){11 12             $this->person = $person;13 14         }15 16         public function show(){17 18             echo $this->person->show(),',穿著褲子';19         }20 21     }
View Code

Glasses.php

 1 <?php 2  3 /** 4 *    Glasses.php 5 **/ 6     class Glasses extends Costume{ 7  8         private $person; 9 10         public function __construct(Person $person){11 12             $this->person = $person;13 14         }15 16         public function show(){17 18             echo $this->person->show(),',帶著眼鏡';19         }20 21     }
View Code

UnderWear.php

 1 <?php 2  3 /** 4 *    UnderWear.php 5 **/ 6     class UnderWear extends Costume{ 7  8         private $person; 9 10         public function __construct(Person $person){11 12             $this->person = $person;13 14         }15 16         public function show(){17 18             echo $this->person->show(),',穿著DK';19         }20 21     }
View Code

Client.php

 1 <?php 2  3     require_once 'Person.php'; 4     require_once 'Costume.php'; 5     require_once 'Student.php'; 6     require_once 'UnderWear.php'; 7     require_once 'Shirt.php'; 8     require_once 'Pants.php'; 9     require_once 'Glasses.php';10 11     // Student繼承Person12     $jc = new Student('JC');13     $jc->show();   // 我是學生JC14     echo '<br>';15 16     // 用UnderWear類裝飾Person17     $underwear = new UnderWear($jc);18     $underwear->show();  // 我是學生JC,穿著DK19     echo '<br>';20 21     // 再用Pants類裝飾Person22     $pants = new Pants($underwear);23     $pants->show();   // 我是學生JC,穿著DK,穿著褲子24     echo '<br>';25 26     // 再用Shirt類裝飾Person27     $shirt = new Shirt($pants);28     $shirt->show();  // 我是學生JC,穿著DK,穿著褲子,穿著襯衫29     echo '<br>';30 31     // 再用Glasses類裝飾Person32     $glasses = new Glasses($shirt);33     $glasses->show();  // 我是學生JC,穿著DK,穿著褲子,穿著襯衫,帶著眼鏡34     echo '<br>';

圖3 輸出結果截圖

Symfony2 EventDispatch 組件對裝飾者模式的應用

圖4 Symfony2 EventDispatch組件使用裝飾模式

圖5 Framework配置EventDispatcher

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美在线观看视频网站 | 99最新网址| 久久国产精品小视频 | 亚洲电影在线观看高清免费 | 成人免费一区二区 | 女人一级一级毛片 | 黄视频网站免费 | 国产亚洲精品综合一区91 | 久久亚洲网| 亚洲一级成人 | 精品国产一区二区三区成人影院 | 一级空姐毛片 | 亚洲国产资源 | 国产一区二区三区四区五区在线 | 曰韩精品 | 久久久久久久久久美女 | 康妮卡特欧美精品一区 | 国产精品伊人久久 | 一区二区三区精品国产 | 羞羞视频一区 | 日本高清在线免费 | 精品国内视频 | 国产精品9191 | 色播亚洲 | 中文字幕网在线 | 请播放一级毛片 | 最新av在线播放 | 欧美女孩videos | 成人在线观看免费爱爱 | 亚洲网站一区 | 爱操在线| asian超清日本肉体pics | 久久久tv| 亚洲精品久久久久久下一站 | 毛片免费观看视频 | 精品在线观看一区二区 | 日韩在线欧美在线 | 国产一区视频在线观看免费 | 日本欧美视频 | 中国美女一级黄色片 | 国产一级一片免费播放 |