装饰模式是面相对象编程的一种设计模式。装饰模式能动态地往子类中添加新的行为。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。
。原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。
修饰模式是类继承的另外一种选择。类继承在编译时候增加行为,而装饰模式是在运行时增加行为。当有几个相互独立的功能需要扩充时,这个区别就变得很重要。在有些面向对象的编程语言中,类不能在运行时被创建,通常在设计的时候也不能预测到有哪几种功能组合。这就意味着要为每一种组合创建一个新类。相反,修饰模式是面向运行时候的对象实例的,这样就可以在运行时根据需要进行组合。其类图为:
php语言实现装饰模式
//组件接口
interface Component {
//操作方法
public function opreation();
}
//具体的被装饰者类
class ConcreteComponet implements Component {
public function opreation() {
echo "ConcreteComponet\'s opreation";
}
}
//装饰类
class Decorator implements Component {
protected $component = null;
//引用Component对象
public function __construct(Component $component) {
$this->component = $component;
}
public function opreation() {
$this->component->operation();
}
}
//具体装饰类
class ConcreteDecoratorA extends Decorator {
//在父类的基础上扩展新的方法
public function operation() {
parent::operation();
echo 'add ConcreteDecoratorA';
}
}
//客户端调用
$componet = new ConcreteComponent();
$ConcreteDecoratorA = new ConcreteDecoratorA($component);
$ConcreteDecoratorA->operation();