23种设计模式-装饰模式
概述
装饰模式是指在不改变现有对象结构的情况下,动态的给该对象增加一些职责(即增加其额外功能)的模式
结构
装饰模式分为以下角色:
- 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象
- 具体构件角色:实现抽象构件,通过装饰角色为其添加一些职责
- 抽象装饰(Decorator)角色:继承或实现抽象构件,并包含具体构件的实例,可以通过其子类拓展具体构件的功能
- 具体装饰角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任
实现
/**
* 比如说我现在要举行一个活动,这个活动可以有抽奖、拼团等功能
*/
/**
* 抽象构件
*/
interface ActivityInterface
{
public function start();
}
/**
* 具体构件
*/
class Activity implements ActivityInterface
{
public function start()
{
echo '开始活动';
}
}
/**
* 抽象装饰器
*/
abstract class ActivityDecorator implements ActivityInterface
{
public function __construct(public ActivityInterface $activity)
{
}
}
/**
* 具体装饰器
*/
class Group extends ActivityDecorator
{
public function start()
{
echo '设置拼团功能';
$this->activity->start();
}
}
/**
* 具体装饰器
*/
class Draw extends ActivityDecorator
{
public function start()
{
echo '设置抽奖功能';
$this->activity->start();
}
}
// 测试
$activity = new Activity();
// 增加拼团功能
$groupActivity = new Group($activity);
// 增加抽象功能
$drawGroupActivity = new Draw($groupActivity);
// 开始活动
$drawGroupActivity->start(); // 打印结果:设置抽奖功能设置拼团功能开始活动