現在我們來繼續講一下裝飾器模式。
裝飾器模式
裝飾模式是通過組合加委託的方式協助我們改變具體組件的功能的一種模式。
為了刺激一下廣大男同胞的荷爾蒙,今天我們通過美女來學習裝飾器模式,手把手教學美女養成。
巧婦難為無米之炊,首先我們先定義一個human類:
class human{ }
human對象便是我們進行改造的對象。
接下來定義一個美女處理抽象基類:
abstract class beautyDevelop{ abstract function develop(human $h);}
我們主要是通過develop抽象方法對傳入的human對象進行改造。
在這裡我們將這一系列的處理分為主要處理和裝飾處理,主要處理就是先把這個人類對象整成一個女人,我們都知道女人。=美女,所以這裡我們就需要運用到裝飾器模式來給這個女人添加上美女的特徵,比如大長腿什麼的。(上面都在扯白,不喜勿噴)
下面是主要處理類和裝飾器抽象類別的定義,主要處理類直接實現develop方法,而裝飾器抽象類別則先抽象出裝飾器類的共同特徵,包括一個處理類對象屬性,用於在實現自身操作後調用子物件方法。
class mainDevelop extends beautyDevelop{ function develop(human $h){ echo "主要處理<br>"; }}abstract class decorateDevelop extends beautyDevelop{ protected $process; function __construct(beautyDevelop $pr){ $this->process=$pr; }
然後定義一系列裝飾器類來使這個女人變成大美女
class angleFace extends decorateDevelop{ function develop(human $h){ echo "添加天使面容<br>"; }}class evilFigure extends decorateDevelop{ function develop(human $h){ echo "添加魔鬼身材<br>"; }}
在裝飾器類的develop方法中,在完成自身操作後,調用子物件操作方法。基於這個,這個美女養成的例子能被開發成一個具有可配置管道的模式,我們可以靈活地添加裝飾器(只需要定義新的裝飾器類,然後將這個新裝飾器對象傳入別的裝飾器中),或者組合現有的裝飾器而無需定義一個新的類去實現固定組合的方法,因此也提高了靈活性。但是需要注意的是,裝飾對象作為子物件的封裝,保持基類中方法儘可能少是很重要的,如果一個基類擁有大量特性,那麼裝飾對象不得不為封裝的子物件的所有public方法加上委託。
好了,現在我們就可以使用裝飾器模式來產生一個美女了.
$human=new human();$obj=new mainDevelop(new angleFace(new evilFigure()));$obj->develop($human);
可以發現,在運行時我們通過合并這些類的初始對象,建立了一條管道(多個裝飾器如同管道般串聯起來),處理的先後順序我們也能夠靈活的改變,所以裝飾器模式不僅能夠根據具體需要靈活添加或減少功能,還可以靈活調整順序。
最後,美女get~