玩命加载中 . . .

3-模板方法


组件协作模式

组件协作模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式

  • Template Method
  • Strategy
  • Observer/Event

Template Method

模板方法

对于某一项任务,有稳定的整体操作结构,但各个步骤却有改变的需求,或者由于固有的原因(比如框架和应用之间的关系)而无法和任务的整体结构同时实现

对于应用程序的开发,一般是先创建Library,再创建Application,然后按照固定的步骤开始运行

// 程序库开发人员
class Library {
public:
    void step1() {
        // ...
    }
    void step3() {
        // ...
    }
    void step5() {
        // ...
    }
};
// 应用程序开发人员
class Application {
public:
    bool step2() {
        // ...
    }
    void step4() {
        // ...
    }
};

int main() {
    Library lib();
    Application app();
    lib.step1();
    if (app.step2()) {
        lib.step3();
    }
    for (int i = 0; i < 4; i++) {
        app.step4();
    }
    lib.step5();
    return 0;
}

框架开发人员可以把流程也写了,但是具体需要应用程序人员自己开发的部分声明为虚函数

// 程序库开发人员
class Library {
public:
    void Run() {
        step1();
        if (step2()) {	// 支持变化 -> 虚函数的多态调用
            step3();
        }
        for (int i = 0; i < 4; i++) {
        	step4();	// 支持变化 -> 虚函数的多态调用
    	}
        step5();
    }
    void step1() {  // 稳定
        // ...
    }
    void step3() {  // 稳定
        // ...
    }
    void step5() {  // 稳定
        // ...
    }
    virtual bool step2() = 0;	// 变化
    virtual void step4() = 0;	// 变化
    virtual ~Library() {}
};

这样应用程序开发人员就继承这个类,实现自定义的方法就行,具体流程就直接调用Library写好的方法

// 应用程序开发人员
class Application : public Library {
public:
    virtual bool step2() {
        // 子类重写方法
    }
    virtual void step4() {
        // 子类重写方法
    }
};

int main() {
    Library *pLib = new Application();
    pLib->Run();
    delete pLib;
    return 0;
}

早绑定与晚绑定

Application 调用 Library 称为早绑定

Library 调用 Application 称为晚绑定,因为需要调用 Application 里面具体的虚函数

模式定义

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


文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录