IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> php-装饰器模式实现 -> 正文阅读

[PHP知识库]php-装饰器模式实现

php-装饰器模式实现

概述

装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式。

我们这里还是以摩托车制造为例。现在我们需要对踏板摩托车进行自定义配件的装饰以及我们希望对其进行第三方质检操作。那么我们就可以用到装饰器模式

模式结构

以本文实例代码为参考

  1. MotorcycleProduce-摩托组装抽象类:建立摩托组装标准工艺
  2. MotocycleProduct-摩托车产品本身
  3. MotorcycleScooter-踏板摩托车
  4. MotorDecorator-抽象摩托车装饰器类
  5. MotorDecoratorA-装饰器A
  6. MotorDecoratorB-装饰器B

UML图例

在这里插入图片描述

代码实例

<?php 
namespace Decorator;
//抽象类-定义生产摩托车流水线标准  Target 目标类
interface  MotorcycleProduce 
{
    //发动机方法
    public function addEngine();
    //车身方法
    public function addBody();
    //车轮方法
    public function addWhell();
    //获取摩托
    public function getMotor();
}
//摩托车产品本身
class MotocycleProduct{
    private $motor = [
        "engine"=>"",
        "body"=>"",
        "whell"=>"",
        "bodyColor"=>"blue"
    ];
    //新增发动机零部件
    public function addEngine($engine){
        $this->motor["engine"] = $engine;
    }
    public function addBody($body){
        $this->motor["body"] = $body;
    }
    public function addWhell($whell){
        $this->motor["whell"] = $whell;
    }
    //获取完整摩托对象
    public function getMotor(){
        return $this->motor;
    }
}
class MotorcycleScooter implements MotorcycleProduce
{
    private $motor;
    public function __construct()
    {
        $this->motor = new MotocycleProduct();
    }
    function addEngine()
    {
        $this->motor->addEngine("踏板摩托-发动机已装好");
    }
    function addBody()
    {
        $this->motor->addBody("踏板摩托-车身已装好");
    }
    function addWhell()
    {
        $this->motor->addWhell("踏板摩托-车轮已装好");
    }
    function getMotor()
    {
        return $this->motor->getMotor();
    }
}
/**
 * 抽象摩托车装饰器类
 */
abstract class MotorDecorator implements MotorcycleProduce{
    protected $motor_cycle;
    public function __construct(MotorcycleProduce $motor_cycle){
        $this->motor_cycle = $motor_cycle;
    }
}
/**
 * 装饰器类-A
 */
class MotorDecoratorA extends MotorDecorator{
    public function addEngine(){
        $this->motor_cycle->addEngine();
    }
    public function addBody()
    {
        $this->motor_cycle->addBody();
    }
    public function addWhell()
    {
        $this->motor_cycle->addWhell();
    }
    public function getMotor()
    {
        $motor = $this->motor_cycle->getMotor();
        $motor["other"] = "个性化配件";
        return $motor;
    }
}
/**
 * 装饰器类
 */
class MotorDecoratorB extends MotorDecorator{
    public function checkMoto(){
        echo "摩托合规性检测-合规<br>";
    }
    public function addEngine(){
        $this->motor_cycle->addEngine();
    }
    public function addBody()
    {
        $this->motor_cycle->addBody();
    }
    public function addWhell()
    {
        $this->motor_cycle->addWhell();
    }
    public function getMotor()
    {
        $motor = $this->motor_cycle->getMotor();
        $this->checkMoto();
        return $motor;
    }
}
$motorScooter = new MotorcycleScooter();
$motorDecoratorA = new MotorDecoratorA($motorScooter);
$motorDecoratorA->addEngine();
$motorDecoratorA->addBody();
$motorDecoratorA->addWhell();
$motor = $motorDecoratorA->getMotor();
var_dump($motor);
echo "<br>";
$motorDecoratorB = new MotorDecoratorB($motorScooter);
$motorDecoratorB->addEngine();
$motorDecoratorB->addBody();
$motorDecoratorB->addWhell();
$motor = $motorDecoratorB->getMotor();
var_dump($motor);

模式分析

  • 使用装饰模式来实现扩展比继承更加灵活,它以对客户透明的方式动态地给一个对象附加更多的责任。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。
  • 相比继承,关联关系的主要优势在于不会破坏原有产品类的封装性,继承是一种耦合度将大的静态关系,扩展起来相对麻烦。不便于后期的维护。由于关联关系使系统具备较好的松耦合性。使得系统更加容易维护。

优缺点

装饰模式的优点:

  • 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。
  • 可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。
  • 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。
  • 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”

装饰模式的缺点:

  • 装饰器模式下会产生很多小对象,这些对象的区别在于他们之间相互连接的方式有所不同。随着装饰类和小对象的增多将会增加系统的复杂度,从而导致了系统在学习和理解起来会相对困难。
  • 由于类的灵活的特性,也同时意味着装饰模式更容易出错,且不容易排错,对于多次装饰的对象,在排错时相对繁琐。

适用环境

在以下情况下可以使用装饰模式:

  • 需要动态的调整单个对象的职责。
  • 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。不能采用继承的情况主要有两类:第一类是系统中存在大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;第二类是因为类定义不能继承(如final类).

获取更多学习资源请关注微信公众号:yuantanphp

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-31 15:13:29  更:2021-08-31 15:15:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:27:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码