23种设计模式-装饰模式


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(); // 打印结果:设置抽奖功能设置拼团功能开始活动

文章作者: 我若为侠
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 我若为侠 !
 上一篇
23种设计模式-桥接模式 23种设计模式-桥接模式
23种设计模式-桥接模式概念桥接模式是指将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现。从而降低了抽象和实现这两个可变维度的耦合度 结构桥接模式包含一下主要角色: 抽象化角色:定义抽象类,并包含一个对实现化对象的引
下一篇 
23种设计模式-适配器模式 23种设计模式-适配器模式
23种设计模式-适配器模式概述将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作 适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件
  目录