装饰模式核心内容:

  • 装饰模式可以在不影响组件对象的情况下,以动态、透明的方式从外部给对象添加功能;
  • 装饰器模式的本质就是动态组合。动态是手段,组合是目的。装饰模式是通过把复杂的功能简单化、分散化,在运行期间,根据需要来动态组合出需要的功能;
  • 使用不同的装饰类以及这些装饰类的排列组合,可以创造出很多不同功能的对象。可以使用多个装饰类来装饰同一对象,创造功能更为强大的对象;
  • 装饰抽象类的接口必须与组件抽象类的接口相同,对于客户端来说无论是装饰之前的对象还是装饰之后的对象都可以使用同样的方式调用;
  • 组件实现类 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. 【编程思想】【设计模式】【行为模式Behavioral】Publish_Subscribe

    Python版 https://github.com/faif/python-patterns/blob/master/behavioral/publish_subscribe.py #!/usr/b ...

  2. AJAX - Http 中 post 和 get 的区别

    HTTP: post 和 get 是 HTTP 协议中的两种方法.浏览器和服务器的交互是通过 HTTP 协议执行的,他的全称为Hyper Text Transfer Protocol(超文本传输协议) ...

  3. Spring Boot项目的不同启动方式

    方式一: 直接通过IntelliJ IDEA启动,直接执行Spring Boot项目的main()方法. 方法二: 将项目打包成jar包,首先需要在pom.xml文件的根节点下添加如下配置: < ...

  4. numpy基础教程--where函数的使用

    在numpy中,where函数是一个三元运算符,函数原型为where(condition, x, y),意思是当条件成立的时候,将矩阵的值设置为x,否则设置为y 一个很简单的应用就是,在一个矩阵当中, ...

  5. 位置式PID讲解

    table { margin: auto } 一.公式拆解 \(PID\)公式展示: \[u(t)=K_p(e(t)+\frac{1}{T_t } ∫_0^te(t)dt+T_D \frac {de( ...

  6. HyperSnips:VSCode上的自动补全神器

    发现一个小众但是巨好用的VSCode自动补全插件:HyperSnips. 作者显然受到了 这位小哥 的启发,将 Vim Ultisnips 的大部分功能搬到了VSCode上.并用 JavaScript ...

  7. [BUUCTF]PWN——jarvisoj_level3_x64

    jarvisoj_level3_x64 附件 步骤: 例行检查,64位程序,开启了nx保护 试运行一下程序,看看大概的情况 64位ida载入,习惯性的检索字符串,没有发现可以直接利用的system,估 ...

  8. Docker 安装&卸载

    不同版本可能有差异具体信息查看官网 官网:https://docs.docker.com/engine/install/centos/ #环境准备 #查看环境 uname -r # 系统内核在3.10 ...

  9. SQL 注入基础

    SQL注入 SQL注入是服务器端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为. 本质:把用户输入的数据当作代码执行.任何和数据库产生交互的地方便有可能存在注入. SQL ...

  10. CF1557B Moamen and k-subarrays 题解

    Content 给定一个大小为 \(n\) 的数组.你可以将其分为 \(k\) 个子数组,并按照每个子数组的字典序重新排列这些子数组,再顺次拼接,得到一个新的数组.问是否存在一种划分子数组的方案,使得 ...