《设计模式》模板方法

Posted joker D888

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《设计模式》模板方法相关的知识,希望对你有一定的参考价值。

《设计模式》模板方法

模板方法是一种行为型设计模式,用于定义一个算法的框架,而将一些步骤的实现留给子类来完成。模板方法在基类中定义了一个模板方法,该方法确定了算法的基本结构,然后将一些步骤的实现交给子类去完成。这个模板方法可以看作是一个“模板”,即算法的框架。具体实现则由子类来完成。

模板方法的优点有:

  1. 提高了代码的复用性:将一些公共的代码放在基类中,避免了重复的代码,提高了代码的复用性。
  2. 提高了代码的可维护性:将一些公共的代码放在基类中,便于修改和维护。
  3. 实现了对扩展开放、对修改关闭的原则:基类中定义的模板方法固定了算法的框架,不需要修改基类的代码,就可以通过子类来扩展和修改算法的具体实现。
  4. 降低了耦合性:子类只需要实现基类中的一些方法,而不需要关心算法的整个过程,降低了子类与基类的耦合性。

模板方法的使用场景有:

  1. 当多个类有共同的算法框架时,可以使用模板方法来避免重复的代码。
  2. 当我们需要在不同的类中实现相同的算法时,可以使用模板方法来提高代码的复用性。
  3. 当我们需要让子类自由扩展某些算法步骤的实现时,可以使用模板方法。
#include <iostream>

using namespace std;

class BaseClass 
public:
    void templateMethod() 
        // 调用基础方法
        baseMethod1();
        baseMethod2();
        // 调用子类实现的方法
        specializedMethod();
    

    void baseMethod1() 
        cout << "这是基础方法1" << endl;
    

    void baseMethod2() 
        cout << "这是基础方法2" << endl;
    

    virtual void specializedMethod() = 0;
;

class ConcreteClassA : public BaseClass 
public:
    void specializedMethod() override 
        cout << "这是ConcreteClassA实现的方法" << endl;
    
;

class ConcreteClassB : public BaseClass 
public:
    void specializedMethod() override 
        cout << "这是ConcreteClassB实现的方法" << endl;
    
;

int main() 
    BaseClass* objA = new ConcreteClassA();
    BaseClass* objB = new ConcreteClassB();

    objA->templateMethod();
    objB->templateMethod();

    delete objA;
    delete objB;

    return 0;

上述代码中,我们首先定义了一个抽象基类BaseClass,它包含了一个模板方法templateMethod和两个基础方法baseMethod1baseMethod2,并且定义了一个纯虚方法specializedMethod。这个抽象基类中的模板方法调用了基础方法和子类实现的方法,这些方法在具体子类中可以被实现。

然后我们定义了两个具体子类ConcreteClassAConcreteClassB,它们都继承了基类BaseClass并实现了specializedMethod方法。

在主函数中,我们分别创建了ConcreteClassAConcreteClassB的实例,并且调用了它们的模板方法templateMethod。这样,我们就可以通过模板方法设计模式来实现不同的子类中共同的算法框架,同时又能够在子类中实现自己的特定方法。

C++ sort

模板方法应用极为普遍,可能很多时候我们都没注意,如C++中的sort函数我们可以自定义比较函数,这个可以由我们自定义的比较函数来进行排序的sort函数就是应用了模板方法的思想

std::sort算法也可以被视为一个模板方法,因为它定义了一个排序算法的骨架,并将实现细节延迟到比较函数中。在使用std::sort时,可以提供一个比较函数作为参数,以指定排序算法的实现。这个比较函数可以被视为子类,它提供了算法的不同实现。

以上是关于《设计模式》模板方法的主要内容,如果未能解决你的问题,请参考以下文章

设计模式的基础

设计模式--15模板方法模式

模板方法设计模式详解C/Java/JS/Go/Python/TS不同语言实现

模板方法模式及php实现

设计模式-模板方法模式(Go语言描述)

设计模式-模板方法模式(Go语言描述)