PHP 高级设计模式:代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP 设计模式:高级水平

\n\n

设计模式(design patterns)是软件开发中常见问题的经过验证的解决方案。在初级阶段,开发者学习单例模式、工厂模式或适配器模式。然而,在复杂、高负载或灵活的 PHP 系统中,需要更强大和更抽象的模板。在本文中,我们将通过真实的 PHP 代码示例来解析四种高级模式:策略模式、工厂方法模式、观察者模式和状态模式。

\n\n

1. 策略模式(Strategy)

\n\n

目的:定义一系列算法,将每个算法封装起来,并使它们可以相互替换。允许在运行时改变对象的行为,而无需修改其代码。

\n\n

示例:支付处理系统。我们有多种支付方式:信用卡、PayPal、加密货币。每种方式都有其自己的验证和处理逻辑。

\n\n
<?php\n\n// 策略接口\ninterface PaymentStrategy\n{\n    public function pay(float $amount): void;\n    public function validate(): bool;\n}\n\n// 具体策略\nclass CreditCardPayment implements PaymentStrategy\n{\n    private string $cardNumber;\n    private string $cvv;\n\n    public function __construct(string $cardNumber, string $cvv)\n    {\n        $this->cardNumber = $cardNumber;\n        $this->cvv = $cvv;\n    }\n\n    public function validate(): bool\n    {\n        // 简单的卡号长度检查\n        return strlen($this->cardNumber) === 16 && strlen($this->cvv) === 3;\n    }\n\n    public function pay(float $amount): void\n    {\n        if (!$this->validate()) {\n            throw new \\InvalidArgumentException("卡数据无效");\n        }\n        echo "通过信用卡 {$this->cardNumber} 支付了 {$amount}。<br>";\n    }\n}\n\nclass PayPalPayment implements PaymentStrategy\n{\n    private string $email;\n\n    public function __construct(string $email)\n    {\n        $this->email = $email;\n    }\n\n    public function validate(): bool\n    {\n        return filter_var($this->email, FILTER_VALIDATE_EMAIL) !== false;\n    }\n\n    public function pay(float $amount): void\n    {\n        if (!$this->validate()) {\n            throw new \\InvalidArgumentException("PayPal 邮箱无效");\n        }\n        echo "通过 PayPal ({$this->email}) 支付了 {$amount}。<br>";\n    }\n}\n\n// 上下文(客户端)\nclass OrderProcessor\n{\n    private PaymentStrategy $strategy;\n\n    public function setPaymentStrategy(PaymentStrategy $strategy): void\n    {\n        $this->strategy = $strategy;\n    }\n\n    public function processOrder(float $total): void\n    {\n        if (!isset($this->strategy)) {\n            throw new \\RuntimeException("未选择支付方式");\n        }\n        $this->strategy->pay($total);\n    }\n}\n\n// 使用示例\n$order = new OrderProcessor();\n$order->setPaymentStrategy(new CreditCardPayment('1234567812345678', '123'));\n$order->processOrder(150.00);\n// 输出:通过信用卡 1234567812345678 支付了 150。\n\n?>
\n\n

优点:可以轻松添加新算法(新的支付方式),而无需修改现有代码。代码变得灵活且可测试。

\n\n

2. 工厂方法模式(Factory Method)

\n\n

目的:定义一个用于创建对象的接口,但让子类决定实例化哪个类。这是所有创建型模式的基础模式。

\n\n

示例:根据用户请求生成不同类型的报告(PDF、HTML、JSON)。

\n\n
<?php\n\n// 抽象产品\ninterface Report\n{\n    public function generate(): string;\n}\n\n// 具体产品\nclass PdfReport implements Report\n                

博客

书籍推荐