专栏首页憧憬博客分享设计模式 | 装饰模式

设计模式 | 装饰模式

说明

  • 定义

在不修改原有对象的基础上, 将功能附加到对象上。符合我们软件开发的开闭原则, 是一个非常经典的设计模式, 部分语言已经将装饰模式设计成了一种语法。

一般装饰器模式需要包涵几个个东西:

  • 操作接口约束
  • 操作具体实现类即被装饰对象
  • 装饰器约束
  • 装饰器实现

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一下

本文为作者原创,手码不易,允许转载,转载后请以链接形式说明文章出处。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Nginx多方面调优策略

    Nginx作为web server热门项目,有着高性能、简单配置以及跨平台,越来越多的企业选择使用它,我们这篇博客来说一下如何优化Nginx

    憧憬博客
  • AntDesignPro使用electron构建桌面应用

    当项目打包成应用后使用的是 file:协议 ant pro 的请求无法发出 需要使用完整的请求地址 目前方法为配置前缀

    憧憬博客
  • Webpack+Babel手把手带你搭建开发环境(内附配置文件)

    为了完成第一项: es6+ 转es5 我们肯定是需要使用babel 我们开始对babel进行配置

    憧憬博客
  • 剑指offer No.1 二维数组中的查找

    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个...

    week
  • 力扣152——乘积最大子序列

    给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

    健程之道
  • leetcode 18 4Sum

    @坤的
  • LeetCode71|数组中第K个最大元素

    请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

    后端Coder
  • 10行python代码制作笑死人不偿命的倒放gif

    现在网络平台上各种有很多倒放视频和倒放gif,其中有些非常的有意思,例如以下图片,慎点,笑死人行哥不偿命

    行哥玩Python
  • 画解算法:面试题3. 数组中重复的数字

    https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/

    FunTester
  • Array - 152. Maximum Product Subarray

    Given an integer array nums, find the contiguous subarray within an array (conta...

    用户5705150

扫码关注云+社区

领取腾讯云代金券