PHP设计模式—装饰器模式

定义:

装饰器模式(Decorator):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器比生成子类更加灵活。

结构:

  • Component:定义一个对象接口,可以给这些对象动态地添加职责。
  • ConcreteComponent:定义了一个具体的对象,也可以给这个对象添加一些职责。
  • Decorator:装饰抽象类,继承了 Component ,从外类来扩展 Component 类的功能,但对于 Component 来说,是无需知道 Decorator 的存在的。
  • ConcreteDecorator:具体的装饰对象,起到给 Component 添加职责的功能。

代码实例:

这里以一个游戏角色为例,角色本身自带基础攻击属性,也可以通过额外的武器装备增加属性值。这里的装备武器就是动态的给角色添加额外的职责。
1、角色Role.php,对应Component

/**
 * 角色,抽象类
 * Class Role
 */
abstract class Role
{
    /**
     * @return mixed
     */
    abstract public function getName();

    /**
     * @return mixed
     */
    abstract public function getAggressivity();
}

2、武器Arms.php,对应ConcreteComponent

/**
 * 武器,继承抽象类
 * Class Arms
 */
class Arms extends Role
{
    /**
     * 基础攻击力
     * @var int
     */
    private $aggressivity = 100;

    /**
     * @return string
     */
    public function getName()
    {
        // TODO: Implement getName() method.
        return '基础攻击值';
    }

    /**
     * @return int
     */
    public function getAggressivity()
    {
        // TODO: Implement getAggressivity() method.
        return $this->aggressivity;
    }

}

3、装饰抽象类RoleDecorator.php,对应Decorator

/**
 * 装饰抽象类
 * Class RoleDecorator
 */
abstract class RoleDecorator extends Role
{
    /**
     * @var Role
     */
    protected $role;

    /**
     * RoleDecorator constructor.
     * @param Role $role
     */
    public function __construct(Role $role)
    {
        $this->role = $role;
    }
}

4、剑Sword.php,对应ConcreteDecorator

/**
 * 剑,具体装饰对象,继承装饰抽象类
 * Class Sword
 */
class Sword extends RoleDecorator
{
    /**
     * @return mixed|string
     */
    public function getName()
    {
        // TODO: Implement getName() method.
        return $this->role->getName() . '+斩妖剑';
    }

    /**
     * @return int|mixed
     */
    public function getAggressivity()
    {
        // TODO: Implement getAggressivity() method.
        return $this->role->getAggressivity() + 200;
    }
}

5、枪Gun.php,对应ConcreteDecorator

/**
 * 枪,具体装饰对象,继承装饰抽象类
 * Class Gun
 */
class Gun extends RoleDecorator
{
    /**
     * @return mixed|string
     */
    public function getName()
    {
        // TODO: Implement getName() method.
        return $this->role->getName() . '+震天戟';
    }

    /**
     * @return int|mixed
     */
    public function getAggressivity()
    {
        // TODO: Implement getAggressivity() method.
        return $this->role->getAggressivity() + 150;
    }
}

6、调用

// 基础攻击值
$arms = new Arms();
echo $arms->getName();
echo $arms->getAggressivity() . '<br>';

// 基础攻击值+斩妖剑
$sword = new Sword(new Arms());
echo $sword->getName();
echo $sword->getAggressivity() . '<br>';

// 基础攻击值+震天戟
$gun = new Gun(new Arms());
echo $gun->getName();
echo $gun->getAggressivity() . '<br>';

// 基础攻击值+斩妖剑+震天戟
$person = new Gun(new Sword(new Arms()));
echo $person->getName();
echo $person->getAggressivity() . '<br>';

7、结果:

基础攻击值100
基础攻击值+斩妖剑300
基础攻击值+震天戟250
基础攻击值+斩妖剑+震天戟450

总结:

  • 装饰器模式就是为已有功能动态地添加更多功能地一种方式。当系统需要新功能时,这些新加入的功能仅仅是为了满足一些特定情况下才会执行的特殊行为的需要。这时,装饰器模式提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,但需要执行特殊行为时,客户端代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。
  • 装饰器模式把类中地装饰功能从类中移除,简化了原有的类。
  • 有效地把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑。
(0)

相关推荐

  • PHP匿名类的用法

    PHP匿名类的用法 在PHP7之后,PHP中加入了匿名类的特性.匿名类和匿名方法让PHP成为了更现代化的语言,也让我们的代码开发工作越来越方便.我们先来看看匿名类的简单使用. // 直接定义 $obj ...

  • 编程语言用正则表达式判断输入的数字是否合法的例子

    编程语言用正则表达式判断输入的数字是否合法的例子 <?php $in="2344"; if(ereg("^(-{0,1}|+{0,1})[0-9]+(.{0,1}[ ...

  • 玩转PHP中的抽象类与接口

    玩转PHP中的抽象类与接口 在面向对象开发中,特别是使用现代化框架的过程中,我们经常会和接口.抽象类打交道.特别是我们自己尝试去封装一些功能时,接口和抽象类往往会是我们开始的第一步,但你真的了解它们吗 ...

  • PHP的rar解压读取扩展包学习

    PHP的rar解压读取扩展包学习 作为压缩解压方面的扩展学习,两大王牌压缩格式 rar 和 zip 一直是计算机领域的压缩终结者.rar 格式的压缩包是 Windows 系统中有接近统治地位的存在,今 ...

  • PHP设计模式之组合模式

    PHP设计模式之组合模式 互联网公司流行扁平化管理,也就是管理层级尽量少于或者不超过三层,作为一个底层的码农,你的CEO和你的职级也就相差3层以内.但是很多传统企业,则会有非常深的层级关系,从数据结构 ...

  • PHP设计模式之装饰器模式

    PHP设计模式之装饰器模式 工厂模式告一段落,我们来研究其他一些模式.不知道各位大佬有没有尝试过女装?据说女装大佬程序员很多哟.其实,今天的装饰器模式就和化妆这件事很像.相信如果有程序媛MM在的话,马 ...

  • 设计模式-装饰器模式

    装饰器模式 定义 装饰器模式也叫包装模式 在不改变原有对象的基础上,把功能附加到对象上,提供了比继承更有弹性的替代方案 能够扩展原有对象的功能 属于结构型模式 生活中的例子 买煎饼 我们煎饼可以加鸡蛋 ...

  • C#设计模式-装饰器模式(Decorator Pattern)

    引言 当我们完成一个软件产品开发后就需要对其进行各种测试,适配快速迭代下质量的保障.当有一个完善的产品的对象后,如果我们想要给他添加一个测试功能,那么我们可以用一个新的类去装饰它来实现对原有对象职责的 ...

  • [PHP小课堂]PHP设计模式之装饰器模式

    [PHP小课堂]PHP设计模式之装饰器模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • java设计模式之装饰器模式

    装饰器模式的定义: 装饰器模式也叫作包装器模式,指在不改变原有对象的基础上,动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活,属于结构性设计模式. 装饰器模式提供了比 ...

  • 设计模式之装饰器模式

    设计模式之装饰器模式

  • 3年工作必备 装饰器模式

    回复"000"获取大量电子书 大家好,我是老田,从今天开始,本公众号每周给大家送福利,送什么呢?肯定是技术书啦,没那么多花里胡哨的,参与方式见文末. 好啦,进入我们的主题,今天我给 ...

  • 结构型设计模式 - 装饰者模式详解

    基本定义 装饰者模式属于结构型模式,它可以动态的将新功能附加到对象上,同时又不改变其结构.在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(OCP). 模式结构 装饰者和被装饰者有相同 ...

  • 设计模式-结构型-装饰者模式

    装饰者模式(wrapper): 允许向一个现有的对象添加新的功能,同时又不改变其结构.装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能.使用对象的关联关系代替继承关系,更加 ...