当前位置:首页 > 设计模式 > 正文内容

php中装饰器模式

phpmianshi9年前 (2012-04-18)设计模式238

概念

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。


优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
 缺点:多层装饰比较复杂。


示例

Shape.class.php(抽象接口)


<?php

namespace Decorator;

interface Shape
{
    public function draw();
}

        Circle.class.php(圆形具体实现类)

<?php

namespace Decorator;

class Circle implements Shape
{
    public function draw()
    {
        print_r("Shape: Circle" );
    }
}

        Rectangle.class.php(长方形具体实现类)

<?php

namespace Decorator;

class Rectangle implements Shape
{
    public function draw()
    {
        print_r("Shape: Rectangle");
    }
}

        ShapeDecorator.class.php(形状装饰类 抽象父类)

<?php

namespace Decorator;

abstract class ShapeDecorator implements Shape
{
    protected $decoratorShape;

    public function __construct(Shape $shape)
    {
        $this->decoratorShape = $shape;
    }

    public function draw()
    {
        $this->decoratorShape->draw();
    }
}

        RedShapeDecorator.class.php

<?php

namespace Decorator;

class RedShapeDecorator extends ShapeDecorator{

    public function __construct(Shape $shape)
    {
        parent::__construct($shape);
    }

    public function draw()
    {
        $this->decoratorShape->draw();
        $this->setRedColor($this->decoratorShape);
    }

    private function setRedColor(Shape $shape)
    {
        print_r("red");
    }
}

        decorator.php(客户端类)

<?php

spl_autoload_register(function ($className){
    $className = str_replace('\\','/',$className);
    include $className.".class.php";
});

use Decorator\Circle;
use Decorator\RedShapeDecorator;

$circle = new Circle();

$redCircle = new RedShapeDecorator(new Circle());
$redCircle->draw();


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

php中享元模式

概念享元模式(Flyweight),为了节约内存的使用,享元模式会尽量使类似的对象共享内存。在大量类似对象被使用的情况中这是十分必要的。常用做法是在外部数据结构中保存类似对象的状态,并在需要时将他们传...

php中原型模式

php中原型模式

概念原型模式(Prototype Pattern):与工厂模式类似,都是用来创建对象的。利用克隆来生成一个大对象,减少创建时的初始化等操作占用开销场景多用于创建大对象,或初始化繁琐的对象。如游戏中的背...

 PHP简单工厂、工厂方法和抽象工厂对比

PHP简单工厂、工厂方法和抽象工厂对比

1、 概念工厂模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。根据抽象程度不同分为:简单工厂模式、...

php中的迭代器模式

概念迭代器:类继承PHP的Iterator接口,批量操作。1. 迭代器模式,在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素。2. 相比传统的编程模式,迭代器模式可以隐藏遍历元素的所需操作。示...

php中责任链模式

概念又叫职责链模式。包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法。示例情景一...

php中的模板模式

概念在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。定义一个操作中的算法的骨架,而将一...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。