PHP装饰器模式扩展功能详解
装饰器模式是一种结构型设计模式,允许在不修改原有类的情况下,通过包装对象来动态添加新功能。

基础实现结构
<?php
// 组件接口
interface ComponentInterface {
public function operate(): string;
}
// 具体组件
class ConcreteComponent implements ComponentInterface {
public function operate(): string {
return "基础功能";
}
}
// 装饰器基类
abstract class Decorator implements ComponentInterface {
protected ComponentInterface $component;
public function __construct(ComponentInterface $component) {
$this->component = $component;
}
public function operate(): string {
return $this->component->operate();
}
}
具体装饰器实现
<?php
// 日志装饰器
class LogDecorator extends Decorator {
public function operate(): string {
$result = parent::operate();
return "[日志记录] " . $result;
}
}
// 缓存装饰器
class CacheDecorator extends Decorator {
public function operate(): string {
$result = parent::operate();
return "[缓存处理] " . $result;
}
}
// 权限校验装饰器
class AuthDecorator extends Decorator {
public function operate(): string {
$this->checkAuth();
$result = parent::operate();
return "[权限已验证] " . $result;
}
private function checkAuth(): void {
// 权限检查逻辑
}
}
实际应用示例 - 数据处理系统
<?php
// 数据处理器接口
interface DataProcessor {
public function process(array $data): array;
}
// 基础数据处理器
class BaseDataProcessor implements DataProcessor {
public function process(array $data): array {
return $data;
}
}
// 验证装饰器
class ValidationDecorator extends Decorator {
public function process(array $data): array {
$this->validate($data);
return parent::process($data);
}
private function validate(array $data): void {
if (empty($data)) {
throw new InvalidArgumentException("数据不能为空");
}
}
}
// 转换装饰器
class TransformDecorator extends Decorator {
public function process(array $data): array {
$data = parent::process($data);
return array_map(function($item) {
return strtoupper($item);
}, $data);
}
}
// 过滤装饰器
class FilterDecorator extends Decorator {
private array $filters;
public function __construct(DataProcessor $processor, array $filters) {
parent::__construct($processor);
$this->filters = $filters;
}
public function process(array $data): array {
$data = parent::process($data);
return array_filter($data, fn($item) => !in_array($item, $this->filters));
}
}
// 使用示例
$processor = new BaseDataProcessor();
$processor = new ValidationDecorator($processor);
$processor = new TransformDecorator($processor);
$processor = new FilterDecorator($processor, ['admin', 'root']);
$result = $processor->process(['user1', 'admin', 'user2', 'root']);
// 结果: ['USER1', 'USER2']
扩展方法封装
<?php
// 装饰器管理器(用于动态组合)
class DecoratorManager {
private array $decorators = [];
private DataProcessor $baseProcessor;
public function __construct(DataProcessor $baseProcessor) {
$this->baseProcessor = $baseProcessor;
}
public function addDecorator(callable $decoratorFactory): self {
$this->decorators[] = $decoratorFactory;
return $this;
}
public function build(): DataProcessor {
$processor = $this->baseProcessor;
foreach ($this->decorators as $factory) {
$processor = $factory($processor);
}
return $processor;
}
}
// 使用建造者模式
$builder = new DecoratorManager(new BaseDataProcessor());
$processor = $builder
->addDecorator(fn($p) => new ValidationDecorator($p))
->addDecorator(fn($p) => new TransformDecorator($p))
->addDecorator(fn($p) => new FilterDecorator($p, ['test']))
->build();
高级应用 - 接口响应处理
<?php
// API响应装饰器
class ApiResponseDecorator extends Decorator {
public function operate(): array {
$result = parent::operate();
return [
'success' => true,
'data' => $result,
'timestamp' => time(),
'version' => '1.0.0'
];
}
}
// 异常处理装饰器
class ExceptionHandlingDecorator extends Decorator {
public function operate(): array {
try {
return parent::operate();
} catch (\Exception $e) {
return [
'success' => false,
'error' => $e->getMessage(),
'code' => $e->getCode()
];
}
}
}
最佳实践
<?php
// 1. 定义清晰的接口
// 2. 保持装饰器单一职责
// 3. 使用接口注入
// 工厂模式创建装饰链
class DecoratorFactory {
public static function createWithLogging(): ComponentInterface {
$component = new ConcreteComponent();
return new LogDecorator($component);
}
public static function createWithFullFeatures(): ComponentInterface {
$component = new ConcreteComponent();
$component = new LogDecorator($component);
$component = new CacheDecorator($component);
$component = new AuthDecorator($component);
return $component;
}
}
优缺点分析
优点:
- 遵循开闭原则,无需修改现有代码
- 可以动态组合多种功能
- 每个装饰器职责单一
缺点:
- 增加系统复杂度
- 调试时可能产生多层嵌套问题
- 装饰器顺序可能影响结果
装饰器模式特别适合需要在运行时动态添加功能的场景,如日志记录、缓存、权限验证、数据转换等横切关注点的处理。