zl程序教程

您现在的位置是:首页 >  其他

当前栏目

设计模式之模板方法模式

2023-09-11 14:22:29 时间

1. 概述

模板方法模式
定义一个操作中的算法的框架,而降这些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

模式中基类和子类的角色
(1)抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
(2)具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。

优点
(2)模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
(2)子类实现算法的某些细节,有助于算法的扩展。
(3)通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

缺点
(1)每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

适用场景
(2)在某些类的算法中,用了相同的方法,造成代码的重复。
(2)控制子类扩展,子类必须遵守算法规则。

模板方法类图

2. 编程模板

#pragma once

#include <iostream>
#include <string>

using std::cout;
using std::endl;

//共有方法基类,给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类中实现
class BaseTemplate
{
public:
    BaseTemplate(){}
    ~BaseTemplate(){}

public:
    virtual void TempMethod1()=0;   //定义两个子类都会有的模板方法,子类进行个性化配置
    virtual void TempMethod2()=0;

public:
    //模板方法,提供了框架,推迟到子类中去实现
    void TempOperate()
    {
        this->TempMethod1();
        this->TempMethod2();
        cout << "base class function;" << endl;
    }   //内联形式函数
};

//继承的派生类1
class ConcreteClassA: public BaseTemplate
{
public:
    ConcreteClassA(){}
    ~ConcreteClassA(){}

public:
    void TempMethod1() override
    {
        cout << "ConcreteClassA TempMethod1;" << endl;
    }
    void TempMethod2() override
    {
        cout << "ConcreteClassA TempMethod2;" << endl;
    }
};

//继承的派生类2
class ConcreteClassB: public BaseTemplate
{
public:
    ConcreteClassB(){}
    ~ConcreteClassB(){}

public:
    void TempMethod1() override
    {
        cout << "ConcreteClassB TempMethod1;" << endl;
    }
    void TempMethod2() override
    {
        cout << "ConcreteClassB TempMethod2;" << endl;
    }
};

int main(void)
{
    BaseTemplate* tempclass = nullptr;

    tempclass = new ConcreteClassA();
    tempclass->TempOperate();

    tempclass = new ConcreteClassB();
    tempclass->TempOperate();

    delete tempclass;
    tempclass = nullptr;
    return 0;
}

3. 运行结果