装饰模式核心内容:

  • 装饰模式可以在不影响组件对象的情况下,以动态、透明的方式从外部给对象添加功能;
  • 装饰器模式的本质就是动态组合。动态是手段,组合是目的。装饰模式是通过把复杂的功能简单化、分散化,在运行期间,根据需要来动态组合出需要的功能;
  • 使用不同的装饰类以及这些装饰类的排列组合,可以创造出很多不同功能的对象。可以使用多个装饰类来装饰同一对象,创造功能更为强大的对象;
  • 装饰抽象类的接口必须与组件抽象类的接口相同,对于客户端来说无论是装饰之前的对象还是装饰之后的对象都可以使用同样的方式调用;
  • 组件实现类 ConcreteComponent 应该尽量保持简洁和轻量,不要把主逻辑之外的辅助逻辑和状态放在组件实现类中,应该通过装饰类对其进行扩展。

定义一个组件抽象类:

abstract class Component
{
abstract public function operation();
}

定义一个组件实现类,实现组件功能:

class ConcreteComponent extends Component
{
public function operation()
{
echo __CLASS__ . '|' . __METHOD__ . "\r\n";
}
}

定义一个装饰器抽象类,接口与组件类一致:

abstract class Decorator extends Component
{
/**
* 持有Component对象,该对象就是被装饰的对象
*/
protected $component; /**
* 构造方法传入
* @param Component $component
*/
public function __construct(Component $component)
{
$this->component = $component;
} abstract public function operation();
}

定义两个装饰器,用来扩展原有组件的功能,或者实现新的功能:

class ConcreteDecoratorA extends Decorator
{
public function beforeOperation()
{
echo __CLASS__ . '|' . __METHOD__ . "\r\n";
} public function afterOperation()
{
echo __CLASS__ . '|' . __METHOD__ . "\r\n";
} public function operation()
{
$this->beforeOperation();
//这里可以调用父类的方法,也可以不调用直接改写实现新功能
$this->component->operation();
$this->afterOperation();
}
} class ConcreteDecoratorB extends Decorator
{
public function beforeOperation()
{
echo __CLASS__ . '|' . __METHOD__ . "\r\n";
} public function afterOperation()
{
echo __CLASS__ . '|' . __METHOD__ . "\r\n";
} public function operation()
{
$this->beforeOperation();
//这里可以调用父类的方法,也可以不调用直接改写实现新功能
$this->component->operation();
$this->afterOperation();
}
}

客户端使用示例:

class Client
{
public function main()
{
$component = new ConcreteComponent();
echo "\r\n直接使用组件:\r\n";
$component->operation(); $decoratorA = new ConcreteDecoratorA($component);
echo "\r\n使用装饰器A装饰后的组件:\r\n";
$decoratorA->operation(); $decoratorB = new ConcreteDecoratorB($decoratorA);
echo "\r\n使用装饰器A和B装饰后的组件:\r\n";
$decoratorB->operation();
}
} $client = new Client();
$client->main();

深入 Laravel 内核之装饰模式的更多相关文章

  1. 深入 Laravel 内核之观察者模式

    装饰模式核心内容: 观察者模式又称为发布订阅模式,定义了对象间的一对多依赖关系,当一个对象状态发生改变时,其相关依赖的其他对象都能接收到通知: 观察者模式的核心在于目标(Subject)和观察者(Ob ...

  2. 深入 Laravel 内核之IOC容器

    升级工厂前的准备工作 无规矩不成方圆,随着越来越多的行为出现,我们需要需要定下一些规范. 为了约束每一个行为的规范,需要定义一个行为接口: interface BehaviorInterface { ...

  3. 深入 Laravel 内核之工厂模式

    英雄与行为,依赖的诞生 首先定义一个英雄,英雄具有一些行为: class Hero { protected $behavior = []; public function show() { var_d ...

  4. 深入 Laravel 内核之外观模式(门面模式)

    门面模式核心内容: 客户端与子系统的通信通过外观对象进行: 外观对象封装一系列子系统的具体对应方法,对客户端只需暴露一个单一的入口方法: 客户端通过访问外观对象即可调用子系统的基础方法,无需关心子系统 ...

  5. 深入 Laravel 内核之 PHP 反射机制和依赖注入

    结论: PHP中提供了反射类来解析类的结构: 通过反射类可以获取到类的构造函数及其参数和依赖: 给构造函数的参数递归设置默认值后,即可使用这些带默认值的参数通过 newInstanceArgs 实例化 ...

  6. laravel 实现思路以及各组件原理

    laravel 内核是个IOC容器,IOC是把本来自己实例化的对象. 通过在容器里注册,通过容器来进行实例化. laravel队列用的是redis的列表来实现.

  7. Laravel源码解析之从入口开始

    前言 提升能力的方法并非使用更多工具,而是解刨自己所使用的工具.今天我们从Laravel启动的第一步开始讲起. 入口文件 laravel是单入口框架,所有请求必将经过index.php define( ...

  8. Laravel核心解读--Contracts契约

    Contracts Laravel 的契约是一组定义框架提供的核心服务的接口, 例如我们在介绍用户认证的章节中到的用户看守器契约IllumninateContractsAuthGuard 和用户提供器 ...

  9. LaravelS - 基于Swoole加速Laravel/Lumen

    LaravelS LaravelS是一个胶水项目,用于快速集成Swoole到Laravel或Lumen,然后赋予它们更好的性能.更多可能性.Github 特性 内置Http/WebSocket服务器 ...

随机推荐

  1. zabbix之主动模式和proxy的主动模式

    #:找一台新主机配置上agent,注意版本要和server端保持一样 #:官网地址:https://www.zabbix.com/documentation/4.0/zh/manual/install ...

  2. golang vendor

    安装参考 https://blog.csdn.net/huwh_/article/details/77169858 Go 1.5引入了vendor文件夹,其对语言使用,go命令没有任何影响.若某个路径 ...

  3. 【Java】【设计模式】单例设计模式

    思想: 为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象 为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象 为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式 代码体 ...

  4. 【Java基础】ExecutorService的使用

    ExecutorService是java中的一个异步执行的框架,通过使用ExecutorService可以方便的创建多线程执行环境. 本文将会详细的讲解ExecutorService的具体使用. 创建 ...

  5. 拉格朗日乘子法(Lagrange Multiplier) 和KKT条件

    参考文献:https://www.cnblogs.com/sddai/p/5728195.html 在求解最优化问题中,拉格朗日乘子法(Lagrange Multiplier)和KKT(Karush ...

  6. pipeline脚本管理

    目录 一.代码仓库 二.远程拉取 一.代码仓库 1.使用gitlab做pipeline脚本的存储,新建一个仓库 2.新建文件,把代码放进去 脚本名可以按照规律填写,环境_应用名_类型,例如:test_ ...

  7. [BUUCTF]REVERSE——内涵的软件

    内涵的软件 附件 例行检查,32位程序 32位ida载入,shift+f12检索程序里的字符串 看到一个很像flag的字符串,拿去尝试一下,成功 flag{49d3c93df25caad8123213 ...

  8. Hexo结合Github搭建个人博客

    如何搭建 我采用了ICARUS主题,根据以下教程完成了部署 https://www.cnblogs.com/liuxianan/p/build-blog-website-by-hexo-github. ...

  9. uniapp+nvue实现仿微信App聊天应用 —— 成功实现好友聊天+语音视频通话功能

    基于uniapp + nvue实现的uniapp仿微信App聊天应用 txim 实例项目,实现了以下功能. 1: 聊天会话管理 2: 好友列表 3: 文字.语音.视频.表情.位置等聊天消息收发 4: ...

  10. Apache Shiro使用官方自带的生成AES密钥

    package test; import org.apache.shiro.codec.Base64; import javax.crypto.KeyGenerator; import javax.c ...