大话设计模式—模板方法模式

Posted May的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大话设计模式—模板方法模式相关的知识,希望对你有一定的参考价值。

在模板方法模式(TemplateMethod Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

大话设计模式中程杰老师给出的定义是:模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

有一个经常用到的实例就是Spirng 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,我们不必重复写那些已经规范好的代码,直接给出一个实体就可以保存。

模板方法模式的结构图如下:

技术分享

代码示例如下:

AbstractClass抽象类其实也就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体的方法,它给出了一个顶级逻辑的骨架,而逻辑组成步骤在相应的抽象操作中,推迟到子类实现;顶级逻辑也有可能去调用一些具体方法。

//抽象类,实现了一些模板方法
public class abstract AbstractClass{

    //一些抽象行为,放到子类中其实现
    public abstract void PrimitiveOperation1();
    public abstract void PrimitiveOperation2();

    //模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,他们都推迟到子类中去实现
    public final void TemplatMethod(){

        initialize();
        PrimitiveOperation1();
        PrimitiveOperation2();

    }

}

ConcreteClass类实现父类所定义的一个或者多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之相对应,而每一个ConcreteClass都可以给出这些抽象方法的不同实现(也就是顶级逻辑组成步骤的不同实现),从而使得顶级逻辑的实现各不相同。

注意ConcreteClass类中方法的顺序和模板类中方法的顺序,具体的逻辑实现顺序至于模板中定义的逻辑顺序有关系。

//抽象类的某个实现类A
public Class ConcreteClassA extends AbstractClass{

    @override
    public void PrimitiveOperation2(){

        System.out.println("类A具体实现方法2");

    }

     @Override
    public void initialize() {
         System.out.println("CocreteClassA Initialized");
    }

    @override
    public void PrimitiveOperation1(){

        System.out.println("类A具体实现方法1");

    }

}
//抽象类的某个实现类B
public Class ConcreteClassB extends AbstractClass{

    @override
    public void PrimitiveOperation2(){

        System.out.println("类B具体实现方法2");

    }

     @Override
    public void initialize() {
         System.out.println("CocreteClassB Initialized");
    }

    @override
    public void PrimitiveOperation1(){

        System.out.println("类B具体实现方法1");

    }

}
//测试方法
public static void main(String[] args){

    AbstractClass ac;

    ac = new ConcreteClassA();
    ac.TemplatMethod();

    ac = new ConcreteClassB();
    ac.TemplatMethod();

}

运行结果:

CocreteClassA Initialized
类A具体实现方法1A具体实现方法2

CocreteClassB Initialized
类B具体实现方法1
类B具体实现方法2

模板方法模式的特点:

1、模板方法模式是通过把不变行为搬移到超类中,去除子类中的重复代码来体现它的优势;

2、模板方法模式就是提供了一个很好的代码复用平台;有时候我们会遇到一系列步骤构成的过程需要执行,这个过程从高层次上看是相同的,但是有些步骤的实现可能不同。

3、当不变的和可变的行为在方法子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,我们通过模板方法模式把这些行为搬移到单一的地方,这样就可以帮助子类摆脱重复的不变行为的纠缠。

优点:

1、封装不变部分,扩展可变部分。

2、提取公共代码,便于维护。

3、行为由父类控制,子类实现。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景:

1、有多个子类共有的方法,且逻辑相同。

2、重要的、复杂的方法,可以考虑作为模板方法。

注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。

以上是关于大话设计模式—模板方法模式的主要内容,如果未能解决你的问题,请参考以下文章

大话设计模式—模板方法模式

大话设计模式读书笔记--7.模板方法模式

java 之 模板模式(大话设计模式)

模板方法模式

模板方法模式

《大话设计模式》--模板模式