PHP项目装饰器模式如何扩展原有功能

wen PHP项目 22

PHP装饰器模式扩展功能详解

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

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;
    }
}

优缺点分析

优点:

  • 遵循开闭原则,无需修改现有代码
  • 可以动态组合多种功能
  • 每个装饰器职责单一

缺点:

  • 增加系统复杂度
  • 调试时可能产生多层嵌套问题
  • 装饰器顺序可能影响结果

装饰器模式特别适合需要在运行时动态添加功能的场景,如日志记录、缓存、权限验证、数据转换等横切关注点的处理。

抱歉,评论功能暂时关闭!