设计模式(四)——Template Method

在一个稍微上规模(怎么也有几十个类吧)的C++程序中,继承和组合的使用比比皆是。虽然GoF提出了OOD的两个原则,第二个谓之『优先使用对象组合,而不是继承』,但这绝不意味着不使用继承,正因如此,第一个原则才是『针对接口编程,而不是针对实现编程』,这两个原则清楚的表达了软件工程中『低耦合』的思想。

模板方法(Template Method)的意图正是『定义一个操作中的算法的框架,而将一些步骤延迟到子类中』。

注意,这里有个关键词『一些』,既然是『一些』,就意味着父类的的接口中已经实现了『一些』步骤,否则,父类便只提供了抽象接口。

这一情况是我们在编码时时常遇到的,父类实现了部分算法中的通用行为,子类根据自己的需求可对其进行必要扩充。

class CBase
{
public:
    // Default done
    virtual void Operation(void)
    {
        ...
    }
};

class CDerive :
    public CBase
{
public:
    virtual void Operation(void)
    {
        switch( ... )
        {
        case A: ...
        case B: ...
        case c: ...
        default:
            CBase::Operation();
        }
    }
};

因为对父类的不了解或是对子类的太了解,你以为CDerive::Operation()做了足够多,不需要CBase::Operation(),但实际上仍然需要的情况总在发生。

换一种方式,把Operation()作为模板方法,把DoOperation()作为可扩展的接口提供给子类实现:

class CBase
{
public:
    void SetFocus(void) { ... }
    void ResetFocus(void) { ... }
    // Call by user
    void Operation(void)
    {
        SetFocus();
        DoOperation();
        ResetFocus();
    }
    // Default done
    virtual void DoOperation(void) = 0;
};

class CDerive :
    public CBase
{
public:
    virtual void DoOperation(void)
    {
        ...
    }
};

模板方法只是提供了一个简单的封装技巧,当然不是所有的虚接口都这么写:)。

更多内容请移步我的个人主页。

你可能感兴趣的:(设计模式(四)——Template Method)