装饰器模式的理解:在原来类的基础上改变功能(增加、减少或重写);
实现:
原来:一个简单的抽象类,一个实体类实现抽象类,用于简单的功能。
装饰之后: 装饰抽象类继承原来简单的抽象类,并实现原来抽象类中的抽象方法,
装饰器的实现类继承装饰器,实现类的构造函数中包含原来简单抽象类的引用,
实现类实现装饰器类增加的抽象方法和重新原来装饰器类实现抽象类的方法,
把简单的实体类传递给装饰器的实现类的构造函数即可增加相应的功能。
简单的代码示例:
1.简单的抽象类 TestDecorateBase.php
<?php
namespace phpadvanced;
abstract class TestDecorateBase
{
protected $name = "haha";
abstract public function getName();
2.简单的抽象类实现类 TestDecorateBaseRealize.php
<?php
namespace phpadvanced;
include_once("./TestDecorateBase.php");
class TestDecorateBaseRealize extends TestDecorateBase
{
public function getName()
{
echo $this->name;
}
}
$obj = new TestDecorateBaseRealize();
$obj->getName();
结果: haha
3.装饰器抽象类 TestDecorater.php
<?php
namespace phpadvanced;
include_once("./TestDecorateBase.php");
abstract class TestDecorater extends TestDecorateBase
{
abstract public function setName();
public function getName(){} //实现抽象类的抽象方法
}
4. 装饰器实现类
<?php
namespace phpadvanced;
include_once("./TestDecorater.php");
include_once("./TestDecorateBaseRealize.php");
include_once("./TestDecorateBase.php");
class TestDecoratee extends TestDecorater
{
private $TestDecorateBase;
public function __construct(TestDecorateBase $TestDecorateBase)
//最重要的地方: 包含原来抽象类 类型的引用
{
$this->TestDecorateBase = $TestDecorateBase;
}
public function setName() //实现装饰器增加的方法
{
$this->TestDecorateBase->name = "hehe";
}
public function getName() //改写装饰器实现的方法
{
echo $this->TestDecorateBase->name;
}
}
$objBase = new TestDecorateBaseRealize();
$objBaseNew = new TestDecoratee($objBase);
$objBaseNew->setName();
$objBaseNew->getName();
结果: hehe
装饰器模式很强大,用于不改变现有功能的前提下扩展新的功能,具体使用方法要在实践中体会。