模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

  这个模式是用来创建一个算法的模板。模板就是一个方法,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。这可以保持算法的结构保持不变,同时由子类提供部分实现。

  这个模式还可以使用一种叫做“钩子”的方法。何谓“钩子”,或,它的作用是什么?

  钩子可以让子类实现算法中的可选部分,让子类能够有机会对模板方法中某些即将发生的(或刚刚发生的)步骤做出反应,或决定是否做某些步骤。

  模板方法中有一些抽象方法,也可能有一些钩子,对于使用何者,如何确定?

  当子类必须提供算法中的某个方法或步骤的实现时,就使用抽象方法;如果这个方法是可选的,就使用钩子。

代码示例:

public abstract class A
{
    // final 关键字表示子类无法覆盖,该方法即模板方法       
    final void templateMethod()              
    {                    
        // 下面即步骤(结构)
    
        // 子类必须覆盖
        Method1();                          

        // 子类必须覆盖
        Method2();                     

        // 钩子,子类选择性覆盖,联系上面所述
        if(hook1())                      
        {
            // 子类无法覆盖
            Method3();                  
        }

        // 钩子,子类选择性覆盖,联系上面所述
        hook2();                        
    }

    abstract void Method1()
    {
        // 定义成抽象方法,由子类实现
    }

    abstract void Method2() {}

    final void Method3()
    {
        // do something
        // 子类直接继承使用即可
    }

    Boolean hook1()
    {
        // 这个方法可以默认不做事,也可以做一些简单的事,
        // 我们称之为“钩子”,子类可以视情况决定要不要覆盖他们,
        // 该钩子一般用来决定是否做某些步骤
    }

    void hook2()
    {
        // 这个方法可以默认不做事,也可以做一些简单的事,
        // 我们称之为“钩子”,子类可以视情况决定要不要覆盖他们
        // 该钩子一般用来做一些事情
    }
}

 

posted on 2014-03-07 12:44  花爱春  阅读(221)  评论(0编辑  收藏  举报