一看就懂的设计模式|模板方法

博客分类: 设计模式 阅读次数:

一看就懂的设计模式|模板方法

是什么?

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 或者 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使的子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。将主要的方法定义为final,防止子类修改算法骨架,将子类必须实现的方法定义为abstract。而普通的方法(无final或abstract修饰)则称之为钩子。

类别

行为型模式

类图

模板方法模式类图

适用场景

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

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

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

4、实现一个算法时,整体步骤很固定。但是某些部分易变,这部分可以抽象出来,留给子类去实现。

常见案例

1、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。

2、Spring IOC容器初始化时

3、队列同步器AbstractQueuedSynchronizer 的设计是基于模板方法模式

优点

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

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

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

缺点

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

实现步骤

步骤 1

创建一个抽象类,它的模板方法被设置为 final,这样这个方法就不能被重写。这个方法里的执行代码步骤也将固定

demo中创建了一个婚姻模板 第一步 认识 ,第二步 热恋 , 第三步 结婚 但是每个人认识的地方,情节不同。


package com.pattern.template_method;

/**
 * Created by chen on 2018/3/19.
 * <p>
 * Email 122741482@qq.com
 * <p>
 * Describe:  创建一个抽象类,它的模板方法被设置为 final
 */

public abstract class Marriage {

    /**
     *
     */
    abstract void acquaintance();

    abstract void amativeness();

    abstract void marry();

    //婚姻  模板  模板方法被设置为 final  不被继承
    public final void run() {

        //相识
        acquaintance();

        //恋爱
        amativeness();

        //结婚
        marry();
    }
}

步骤2

扩展抽象类,实现了张三 和李四的 婚姻模板 张三

package com.pattern.template_method;

/**
 *
 * @author chen
 * @date 2018/3/19
 * <p>
 * Email 122741482@qq.com
 * <p>
 * Describe:
 */
public class ZhangSan extends Marriage {
    @Override
    void acquaintance() {
        System.out.println("在公园认识");

    }

    @Override
    void amativeness() {
        System.out.println("在西湖热恋");
    }

    @Override
    void marry() {
        System.out.println("在阿尔卑斯山结婚");
    }
}


李四


package com.pattern.template_method;

/**
 * Created by chen on 2018/3/19.
 * <p>
 * Email 122741482@qq.com
 * <p>
 * Describe:
 */
public class LiSi extends Marriage {
    @Override
    void acquaintance() {
        System.out.println("在酒吧认识");
    }

    @Override
    void amativeness() {
        System.out.println("在酒店热恋");
    }

    @Override
    void marry() {
        System.out.println("在法国结婚");
    }
}

步骤3

执行模板方法

package com.pattern.template_method;

/**
 * @author chen
 * @date 2018/3/19
 * <p>
 * Email 122741482@qq.com
 * <p>
 * Describe:
 */
public class TemplateMethodDemo {

    public static void main(String[] args) {
        Marriage zs = new ZhangSan();
        zs.run();
        Marriage ls = new LiSi();
        ls.run();
    }
}

步骤4

查看输出

在公园认识
在西湖热恋
在阿尔卑斯山结婚
在酒吧认识
在酒店热恋
在法国结婚

博客源码地址https://gitee.com/jamen/design-pattern

我的官网http://guan2ye.com 我的CSDN地址http://blog.csdn.net/chenjianandiyi 我的简书地址http://www.jianshu.com/u/9b5d1921ce34 我的githubhttps://github.com/javanan 我的码云地址https://gitee.com/jamen/ 阿里云优惠券https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=9ytvzpwr

阿里云教程系列网站http://aliyun.guan2ye.com

1.png

我的开源项目spring boot 搭建的一个企业级快速开发脚手架

1.jpg

阿里云优惠券
我的github
我的码云