行为型模式--模板方法

1、意图

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

2、结构

 

 3、参与者

  AbstractClass:抽象类。定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤;实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义AbstractClass或其他对象中的操作;

  ConcreteClass:具体类。实现原语操作以完成算法中与特定子类相关的步骤。

4、适用性

  模板方法应用于下列情况:

  1)一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

  2)各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

  3)控制子类扩展。模板方法只在特定点调用“hook”操作(钩子操作,它提供了缺省的行为,子类可以在必要时进行扩展。一个钩子操作在缺省操作通常是一个空操作),这样就只允许在这些点进行扩展。

5、代码示例

// 一个支持在屏幕上绘图的类view,基类view强制了绘图的步骤,这是个模板方法
void view::Display ()
{
    // 绘图前必须先设置好焦点
    SetFocus(); 
    
    // 执行真正绘图操作
    DoDisplay(); 
    
    // 清除绘图状态
    ResetFocus();
}

// 为维持不变部分,View的客户通常调用Display,而View的子类通常重定义DoDisplay

// View本身的DoDisplay什么也不做
void view:DoDisplay (){}

// 子类重定义它以增加它们的特定绘图行为
void Myview::DoDisplay ()
{
    // render the view's contents
}

6、总结

  模板方法定义了一个操作中的算法骨架,并将该算法的一些子步骤延迟到子类中实现。

  模板方法应该明确指明哪些步骤是要在子类中重定义的。C++通常在抽象类中实现模板方法,并将需要在子类中重定义的操作定义为纯虚函数。

posted @ 2022-05-04 18:40  流翎  阅读(23)  评论(0编辑  收藏  举报