模板模式原理及案例分析

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

 

  从上面定义可以看出,模板方法是可以理解为一个算法的框架,而具体的计算数据却需要使用者来自行地添加。

 

  举一个模板方法的简单例子:制造杯子的工艺流程可以大致分为四步:准备材料,熔解材料,注入模具,冷却成型。现在我需要制作有把手和没把手两种型号的杯子,该怎么做呢?

 

  相必大家肯定会很快地想到将熔解后的材料注入相应的模具中,而结果正是如此。但是每种型号杯子都要全部实现四部流程吗?如果那样做,真的是太繁琐了。我们可以将其余三个公共的步骤集成到父类之中,成为一个固定的算法。而用子类来实现决定杯子型号的第三步。

 

  此外,一般情况下,模板模式的父类算法步骤中,都会带有一个所谓的“钩子”方法,此方法一般为空的方法,可以让子类的不同实现来对父类进行挂钩,要不要挂钩,则由子类来决定,在此案例中,我们允许有把手的杯子格外进行染色操作(挂钩),而不带把手的杯子则什么都不做。

  代码如下:

扫描二维码关注公众号,回复: 596722 查看本文章

  这是实现固定算法的父类

public abstract class Cup {
    public void makeCup() {
        prepareMaterials();
        meltMaterials();
        intoMold();
        cooling();
        hook();
    }

    void prepareMaterials(){
        System.out.println("prepare materials");
    }

    void meltMaterials(){
        System.out.println("melt materials");
    }

    abstract void intoMold();

    void cooling(){
        System.out.println("cool model");
    }

    void hook(){}

}

 

 带把手的杯子实现与不带把手的杯子实现。

public class CupwithHolder extends Cup{
    public void intoMold(){
        System.out.println("I have a holder");
    }
    @Override
    public void hook(){
        System.out.println("I need to become red");
    }
}

public class CupwithoutHolder extends Cup{

    public void intoMold(){
        System.out.println("I do not have a holder");
    }
}

 

 运行类:

public class CupSimulator {

    public static void main(String[] args){
        CupwithHolder cupwithHolder = new CupwithHolder();
        cupwithHolder.makeCup();

        System.out.println("========================");

        CupwithoutHolder cupwithoutHolder = new CupwithoutHolder();
        cupwithoutHolder.makeCup();
    }
}

 

 最后的输出结果为:

 

prepare materials
melt materials
I have a holder
cool model
I need to become red
========================
prepare materials
melt materials
I do not have a holder
cool model

 

       大家从这个例子中可以看到:在父类定义了一个算法的步骤,并允许子类来实现一个或多个步骤。之所以采用“允许”的字眼是因为其控制权是掌握在父类中的。

 

      由于模板方法始终强调算法的步骤,因此在spring源码中有着大量的应用,是很常用的设计模式。

 

  

猜你喜欢

转载自chn-wangzhenjiang.iteye.com/blog/2316475