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;
}
}
优缺点分析
优点:
- 遵循开闭原则,无需修改现有代码
- 可以动态组合多种功能
- 每个装饰器职责单一
缺点:
- 增加系统复杂度
- 调试时可能产生多层嵌套问题
- 装饰器顺序可能影响结果
装饰器模式特别适合需要在运行时动态添加功能的场景,如日志记录、缓存、权限验证、数据转换等横切关注点的处理。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播