说明
- 定义
在不修改原有对象的基础上, 将功能附加到对象上。符合我们软件开发的开闭原则, 是一个非常经典的设计模式, 部分语言已经将装饰模式设计成了一种语法。
一般装饰器模式需要包涵几个个东西:
- 操作接口约束
- 操作具体实现类即被装饰对象
- 装饰器约束
- 装饰器实现
Laravel
的中间件就是如此设计, 具体大家可以看看 源码, 这里不多赘述
- 例如说:
我们常见到的一些美女拍照, 对吧, 照片不是一拍就那么好看的吧(当然, 有好看的麻烦介绍给博主)。拍出的照片需要装饰一下,而且这个装饰可能是在拍照前及拍照后,因为拍照前不得开美颜?拍完后不得p图??
如果我们单独写一个拍照的类, 那要增加这些东西是肯定需要修改代码的, 且不利于复用, 你看有些天生丽质的, 就不需要这么些乱七八糟, 只要拍照就行, 那为了我们的程序可扩展性更强, 我们这边使用装饰器模式来实现一下吧, 在做业务的时候也经常遇到这种情况, 所以小伙伴们要灵活运用哦。
示例
<?php /** * Created by 憧憬. */ /** * 拍照接口 * Interface Photograph */ interface PhotographInterface { public function take(); } /** * 简单拍照实现 * Class Photograph */ class Photograph implements PhotographInterface { /** * 正常拍照 * @author: 憧憬 */ public function take() { echo '直接拍照,懂?'; } } /** * 设计装饰器的约束 只要是继承抽象的都应该拥有一个拍照对象, 你要装饰也要约束, 装饰的哪个方法?所以直接实现拍照接口 * Class Decorator */ abstract class Decorator implements PhotographInterface { public $photograph; public function __construct(PhotographInterface $photograph) { $this->photograph = $photograph; } } /** * 美颜滤镜装饰 * Class LensDecorator */ class LensDecorator extends Decorator { /** * 直接添加美颜滤镜 * @author: 憧憬 */ public function take() { echo '添加美颜滤镜啊'; $this->photograph->take(); } } /** * ps类 * Class PsDecorator */ class PsDecorator extends Decorator { public function take() { // TODO: Implement take() method. $this->photograph->take(); echo '拍完照ps一下'; } } $photograph = new Photograph(); //$photograph->take(); // 直接拍照,懂? // 拍照前添加美颜滤镜 如果还需要再美颜滤镜前做更多操作, 再实现一个装饰类, 然后把美颜滤镜这个实例放进去即可 $lensDecorator = new LensDecorator($photograph); //$lensDecorator->take(); // 添加美颜滤镜啊 再直接拍照,懂? // 拍完照ps一下 $psDecorator = new PsDecorator($lensDecorator); $psDecorator->take(); // 添加美颜滤镜啊 直接拍照,懂? 拍完照ps一下
本文为作者原创,手码不易,允许转载,转载后请以链接形式说明文章出处。