深入 Laravel 内核之装饰模式
装饰模式核心内容:
- 装饰模式可以在不影响组件对象的情况下,以动态、透明的方式从外部给对象添加功能;
- 装饰器模式的本质就是动态组合。动态是手段,组合是目的。装饰模式是通过把复杂的功能简单化、分散化,在运行期间,根据需要来动态组合出需要的功能;
- 使用不同的装饰类以及这些装饰类的排列组合,可以创造出很多不同功能的对象。可以使用多个装饰类来装饰同一对象,创造功能更为强大的对象;
- 装饰抽象类的接口必须与组件抽象类的接口相同,对于客户端来说无论是装饰之前的对象还是装饰之后的对象都可以使用同样的方式调用;
- 组件实现类 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 内核之装饰模式的更多相关文章
- 深入 Laravel 内核之观察者模式
装饰模式核心内容: 观察者模式又称为发布订阅模式,定义了对象间的一对多依赖关系,当一个对象状态发生改变时,其相关依赖的其他对象都能接收到通知: 观察者模式的核心在于目标(Subject)和观察者(Ob ...
- 深入 Laravel 内核之IOC容器
升级工厂前的准备工作 无规矩不成方圆,随着越来越多的行为出现,我们需要需要定下一些规范. 为了约束每一个行为的规范,需要定义一个行为接口: interface BehaviorInterface { ...
- 深入 Laravel 内核之工厂模式
英雄与行为,依赖的诞生 首先定义一个英雄,英雄具有一些行为: class Hero { protected $behavior = []; public function show() { var_d ...
- 深入 Laravel 内核之外观模式(门面模式)
门面模式核心内容: 客户端与子系统的通信通过外观对象进行: 外观对象封装一系列子系统的具体对应方法,对客户端只需暴露一个单一的入口方法: 客户端通过访问外观对象即可调用子系统的基础方法,无需关心子系统 ...
- 深入 Laravel 内核之 PHP 反射机制和依赖注入
结论: PHP中提供了反射类来解析类的结构: 通过反射类可以获取到类的构造函数及其参数和依赖: 给构造函数的参数递归设置默认值后,即可使用这些带默认值的参数通过 newInstanceArgs 实例化 ...
- laravel 实现思路以及各组件原理
laravel 内核是个IOC容器,IOC是把本来自己实例化的对象. 通过在容器里注册,通过容器来进行实例化. laravel队列用的是redis的列表来实现.
- Laravel源码解析之从入口开始
前言 提升能力的方法并非使用更多工具,而是解刨自己所使用的工具.今天我们从Laravel启动的第一步开始讲起. 入口文件 laravel是单入口框架,所有请求必将经过index.php define( ...
- Laravel核心解读--Contracts契约
Contracts Laravel 的契约是一组定义框架提供的核心服务的接口, 例如我们在介绍用户认证的章节中到的用户看守器契约IllumninateContractsAuthGuard 和用户提供器 ...
- LaravelS - 基于Swoole加速Laravel/Lumen
LaravelS LaravelS是一个胶水项目,用于快速集成Swoole到Laravel或Lumen,然后赋予它们更好的性能.更多可能性.Github 特性 内置Http/WebSocket服务器 ...
随机推荐
- OpenStack之八: network服务(端口9696)
注意此处用的一个网络,暂时不用启动第二个网官网地址 https://docs.openstack.org/neutron/stein/install/controller-install-rdo.ht ...
- 阿里云esc 安装 docker
1. 更新 yum 到最新: yum update (用 root 用户登录,无需加 sudo,如果不是,需要加,即 yum update ) 2. 安装软件包:yum-util(提供 yum-co ...
- java输入/输出流的基本知识
通过流可以读写文件,流是一组有序列的数据序列,以先进先出方式发送信息的通道. 输入/输出流抽象类有两种:InputStream/OutputStream字节输入流和Reader/Writer字符输入流 ...
- SQL注入 (1) SQL注入类型介绍
SQL注入 SQL注入介绍与分类 1. 什么是sql注入 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 2. sql注入类型 按照注入 ...
- C#深入理解多态
1.里氏替换原则 1.里氏替换原则:在一个软件系统中,如果子类出现在父类出现的位置,而整个软件功能又没有影响,那么咱们称为里氏替换. 2. 考试题:父类变量指向子类对象!! 3.里氏替换 是 ...
- apt和apt-get的区别
目录 一.简介 二.apt vs apt-get 为什么apt首先被引入? apt和apt-get之间的区别 apt和apt-get命令之间的区别 我应该使用apt还是apt-get? 三.结论 一. ...
- 转置Table.Transpose(Power Query 之 M 语言)
数据源: 任意五行两列 目标: 转置成两行五列 操作过程: [转换]>[转置] M公式: = Table.Transpose( 表 )
- docker初识-docker安装、基于docker安装mysql及tomcat、基本命令
一.docker是什么 用go语言开发,开源的应用容器引擎,容器性能开销极低 二.整体架构图 Docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 r ...
- libevent源码学习(17):缓冲管理框架
目录Libevent缓冲区类型Libevent缓冲区结构缓冲区的读出与写入缓冲区的读入与写出缓冲区水位机制缓冲区回调机制延迟回调机制Libevent缓冲区类型 Libevent中提供了多种 ...
- Spring学习(四)在Web项目中实例化IOC容器
1.前言 前面我们讲到Spring在普通JAVA项目中的一些使用.本文将介绍在普通的Web项目中如何实例化Spring IOC容器.按照一般的思路.如果在Web中实例化Ioc容器.这不得获取Conte ...