PHP装饰模式

来源:互联网 发布:node调用webservice 编辑:程序博客网 时间:2024/06/04 01:38
【定义】装饰模式,英文叫Decorator Pattern,又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
功能定义如果完全依赖于继承体系,会导致类的数量和层次过多,代码不好控制而且会产生重复。
【类型结构型模式
【问题】比如一个咖啡的类,为了实现加热的咖啡,加糖的咖啡,加冰的咖啡,加了牛奶和冰的咖啡......,如果要以继承方式实现,那么类的数量太多了,每多一个需求就需要多创建一个类。
此时如果有个装饰器,专门控制对咖啡进行加工和装饰,那么事情就条理清晰易于控制了。总结:如果已有对象的部分内容或功能性发生改变,但是不需要修改原始对象的结构,那么使用装饰器设计模式最适合。使用装饰器模式的目标是:不必重写任何已有的功能性,而是对某个基对象应用增量变化。构建方式:在主代码流中应当能够直接插入更改或装饰目标的对象的装饰器,同时不影响其他代码流。

【装饰模式中主要角色】
抽象构件(Component)角色:定义一个对象接口,以规范准备接收附加职责的对象,从而可以给这些对象动态地添加职责。
具体构件(Concrete Component)角色:定义一个将要接收附加职责的类。
装饰(Decorator)角色:持有一个指向Component对象的指针,并定义一个与Component接口一致的接口。
具体装饰(Concrete Decorator)角色:负责给构件对象增加附加的职责。

示例:

//抽象构建(Component)角色:Drink,饮料类

abstract class Drink {

public abstract function showDrink();

}

//具体构件(Concrete Component)角色:Coffe ,咖啡类

class Coffee extends Drink {

private $name;

public function __construct($name){

$this->name = $name;

}

public function showDrink(){

echo "咖啡的名称为:{$this->name}";

}

}

//装饰(Decorator)角色:DecoratorDrink,咖啡装饰类

abstract class DecoratorDrink extends Drink {

protected $drink;

public function __construct(Drink $drink){

$this->drink = $drink;

}

public function showDrink(){

if($this->drink != null){

$this->drink->showDrink();

}

}

}

//具体装饰(Concrete Decorator)角色:加糖类,加奶类,加热类,加冰类

class Sugar extends DecoratorDrink {

public function showDrink(){

$this->drink->showDrink();

echo " 加糖 ";

}

}

class Milk extends DecoratorDrink {

public function showDrink(){

$this->drink->showDrink();

echo " 加奶 ";

}

}

class Ice extends DecoratorDrink {

public function showDrink(){

$this->drink->showDrink();

echo " 加冰 ";

}

}

class Hot extends DecoratorDrink {

public function showDrink(){

$this->drink->showDrink();

echo " 加热 ";

}

}

调用示例:

$coffee = new Coffee("拿铁咖啡");

$sugar = new Sugar($coffee);

$hot = new Hot($sugar);

$hot->showDrink();


$blue_mountain = new Coffee("蓝山咖啡");

$milk = new Milk($blue_mountain);

$ice = new Ice($milk);

$ice->showDrink();

//输出结果为:

咖啡的名称为:拿铁咖啡 加糖 加热

咖啡的名称为:蓝山咖啡 加奶 加冰

【装饰模式的优缺点】
装饰模式的优点:
1、比静态继承更灵活;
2、避免在层次结构高层的类有太多的特征
装饰模式的缺点:
1、使用装饰模式会产生比使用继承关系更多的对象。并且这些对象看上去都很想像,从而使得查错变得困难。

【装饰模式适用场景】
1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2、处理那些可以撤消的职责,即需要动态的给一个对象添加功能并且这些功能是可以动态的撤消的。
3、当不能彩生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

0 0
原创粉丝点击