PHP设计模式之模板方法模式实例详解

模板方法模式(Template Method Pattern)定义一个算法的步骤,并允许子类提供一些步骤的具体实现。这使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。

模板方法模式的主要角色:

– 抽象类(Abstract Class):定义了算法的框架和主要步骤,并在一些步骤中实现默认行为。

– 具体子类(Concrete Class):实现抽象类中所定义的抽象方法,提供某些步骤的具体实现。

模板方法模式的优点:

– 封装不变部分,扩展可变部分:模板方法模式实现了稳定的算法框架,而可变的步骤由子类实现。

– 避免重复:每个子类只需要实现自己需要变化的部分,不变部分由父类提供。

– 流程控制:算法的控制流程由父类 all,子类只需要关注自身的实现逻辑。下面通过一个实例来演示模板方法模式的用法

抽象类:

abstract class Beverage {
    final function prepareRecipe() {
        $this->boilWater();
        $this->brew();
        $this->pourInCup();
        $this->addCondiments(); 
    }
    
    abstract function brew();
    abstract function addCondiments();
    
    function boilWater() {
        echo "Boiling water\n"; 
    } 
    function pourInCup() {
        echo "Pouring into cup\n"; 
    }
}

具体子类:

class Coffee extends Beverage {
    function brew() {
        echo "Dripping coffee through filter\n"; 
    }
    function addCondiments() {
        echo "Adding sugar and milk\n"; 
    }
}

class Tea extends Beverage {
    function brew() {
        echo "Steeping the tea\n"; 
    }
    function addCondiments() {
        echo "Adding lemon\n";
    }
}

测试:

$coffee = new Coffee();
$coffee->prepareRecipe();

$tea = new Tea();  
$tea->prepareRecipe();

输出:

Boiling water 
Dripping coffee through filter
Pouring into cup
Adding sugar and milk

Boiling water
Steeping the tea
Pouring into cup 
Adding lemon

通过这个实例,我们清晰的看到模板方法模式的结构和工作机制。

Beverage类定义了算法框架,而子类Coffee和Tea具体实现了需要变化的步骤,从而完成两个不同类型饮料的准备过程。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论