模板方法模式(Template Method Pattern) C++

上一节:工厂模式(Factory Pattern) C++

文章目录

  • 1.理论
  • 2.实践

1.理论

模板方法模式(Template Method Pattern)是一种行为设计模式,用于定义一个算法的骨架,将一些步骤的实现延迟到子类中。在模板方法模式中,一个抽象类定义了一个模板方法,该方法包含了算法的主要步骤,而具体的实现则由子类来完成。
模板方法模式的核心思想是,将算法的结构固定下来,但是允许子类根据自己的需要实现特定的步骤。这样可以保持算法的一致性,同时又能够灵活地扩展和定制算法的具体实现。
以下是模板方法模式的主要参与者:

  1. 抽象类(Abstract Class) :定义一个模板方法,该方法包含了算法的主要步骤,其中某些步骤可以由子类来实现。抽象类可以包含具体方法、抽象方法或钩子方法(可以由子类选择性地实现)。
  2. 具体类(Concrete Class):继承抽象类并实现其中的抽象方法,完成算法的具体步骤。

模板方法模式的工作流程如下:

  1. 抽象类定义了一个模板方法,该方法包含了算法的主要步骤,并调用其他方法完成算法的各个子步骤。
  2. 具体类继承抽象类,并实现其中的抽象方法,完成算法的具体实现。
  3. 客户端代码通过调用抽象类的模板方法来执行算法,具体的步骤由具体类来完成。

通过使用模板方法模式,可以实现算法的复用和扩展。算法的骨架由抽象类定义,而具体的实现可以在具体类中灵活地实现和修改,从而提高代码的复用性和可维护性。

2.实践

你现在是一个游戏开发人员,你要设计一个游戏,其中有两个角色:战士(Warrior)和法师(Wizard)。每个角色都有一个公共的行为:攻击(Attack)。战士和法师的攻击方式略有不同,但它们都有相同的执行流程。这就是我们可以使用模板方法模式的场景。
首先,我们创建一个抽象类Character,它定义了一个模板方法Attack(),以及两个具体方法PrepareWeapon()和ExecuteAttack()。

#include 

class Character {
public:
    void Attack() {
        PrepareWeapon();
        ExecuteAttack();
        std::cout << "Attack finished." << std::endl;
    }

    virtual void PrepareWeapon() = 0;
    virtual void ExecuteAttack() = 0;
};

接下来,我们创建具体类Warrior和Wizard,它们分别继承自Character,并实现了具体的攻击方式。

class Warrior : public Character {
public:
    void PrepareWeapon() override {
        std::cout << "Warrior prepares sword and shield." << std::endl;
    }

    void ExecuteAttack() override {
        std::cout << "Warrior swings the sword and strikes the enemy." << std::endl;
    }
};

class Wizard : public Character {
public:
    void PrepareWeapon() override {
        std::cout << "Wizard prepares magic staff." << std::endl;
    }

    void ExecuteAttack() override {
        std::cout << "Wizard casts a powerful spell on the enemy." << std::endl;
    }
};

现在,我们可以使用这些类来创建角色对象并执行攻击。

int main() {
    Character* warrior = new Warrior();
    warrior->Attack();

    Character* wizard = new Wizard();
    wizard->Attack();

    delete warrior;
    delete wizard;

    return 0;
}

执行结果

Warrior prepares sword and shield.
Warrior swings the sword and strikes the enemy.
Attack finished.
Wizard prepares magic staff.
Wizard casts a powerful spell on the enemy.
Attack finished.

完整代码:

#include 

class Character {
public:
    void Attack() {
        PrepareWeapon();
        ExecuteAttack();
        std::cout << "Attack finished." << std::endl;
    }

    virtual void PrepareWeapon() = 0;
    virtual void ExecuteAttack() = 0;
};
class Warrior : public Character {
public:
    void PrepareWeapon() override {
        std::cout << "Warrior prepares sword and shield." << std::endl;
    }

    void ExecuteAttack() override {
        std::cout << "Warrior swings the sword and strikes the enemy." << std::endl;
    }
};

class Wizard : public Character {
public:
    void PrepareWeapon() override {
        std::cout << "Wizard prepares magic staff." << std::endl;
    }

    void ExecuteAttack() override {
        std::cout << "Wizard casts a powerful spell on the enemy." << std::endl;
    }
};
int main() {
    Character* warrior = new Warrior();
    warrior->Attack();

    Character* wizard = new Wizard();
    wizard->Attack();

    delete warrior;
    delete wizard;

    return 0;
}

在这个例子中,抽象类Character定义了一个模板方法Attack(),它规定了攻击的执行流程。具体类WarriorWizard继承自Character,并根据自己的特点实现了具体的攻击方式。客户端代码通过调用Attack()方法来触发攻击,而具体的攻击流程由各个角色类来完成。

这就是模板方法模式的基本思想:将算法的骨架定义在抽象类中,而将具体的实现留给子类来完成。这样可以实现算法的复用和扩展,同时保持算法的一致性。

下一节:建造者模式(Builder Pattern)C++

你可能感兴趣的:(设计模式,c++,模板方法模式,设计模式)