现在我们来继续讲一下装饰器模式。
装饰器模式
装饰模式是通过组合加委托的方式帮助我们改变具体组件的功能的一种模式。
为了刺激一下广大男同胞的荷尔蒙,今天我们通过美女来学习装饰器模式,手把手教学美女养成。
巧妇难为无米之炊,首先我们先定义一个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~