目录

组件协作_TemplateMethod


组件协作模式

现代软件专业分工之后的第一个结果是"框架与应用程序"的划分 组件协作是通过晚期绑定, 来实现框架和应用之间的松耦合, 是二者协作时常用的模式 典型模式有: Template Method, Strategy, Observer/Event

1 Template Method 模版模式

1.1 模式动机

在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求, 或者由于固有的原因(比如框架与应用的分离)而无法和任务的整体结构同时实现。 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?这就是一些重要问题。

1.2 模式定义

定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method 使得子类可以不改变(复用)一个算法的结构即可重定义(override)该算法的某些特定步骤。

1.3 模式示例代码

# include <iostream>

// 抽象类,定义模板方法
class Library {
public:
    // 模板方法,定义算法骨架, 稳定
    void templateMethod() {
        step1();
        step2();
        step3();
    }

    virtual ~Library() {}

protected:
    // 抽象步骤,由子类实现具体细节
    virtual void step1() = 0;
    virtual void step2() = 0;
    virtual void step3() = 0;
};

// 具体类,实现模板方法
class Application : public Library {
protected:
    void step1() override {
        std::cout << "应用程序:步骤1" << std::endl;
    }

    void step2() override {
        std::cout << "应用程序:步骤2" << std::endl;
    }

    void step3() override {
        std::cout << "应用程序:步骤3" << std::endl;
    }
};

int main() {
    Library* instance = new Application();
    instance->templateMethod();

    delete instance;

    return 0;
}
应用程序:步骤1
应用程序:步骤2
应用程序:步骤3

2 要点总结

  • 不要调用我, 让我来调用你, 这种反向控制结构是 Template Method 的典型应用
  • 虚函数是一个灵活的扩展点, 是代码复用的主要实现结构, 其它面向对象语言中也有类似的实现机制(接口等)