设计模式 | 装饰模式
时间:2022-07-22
本文章向大家介绍设计模式 | 装饰模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
说明
- 定义
在不修改原有对象的基础上, 将功能附加到对象上。符合我们软件开发的开闭原则, 是一个非常经典的设计模式, 部分语言已经将装饰模式设计成了一种语法。
一般装饰器模式需要包涵几个个东西:
- 操作接口约束
- 操作具体实现类即被装饰对象
- 装饰器约束
- 装饰器实现
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一下
本文为作者原创,手码不易,允许转载,转载后请以链接形式说明文章出处。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法