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

是什么?

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

类别

行为型模式

类图

一看就懂的设计模式--模板方法_第1张图片
模板方法模式类图

适用场景

1、有多个子类共有的方法,且逻辑相同。
2、重要的、复杂的方法,可以考虑作为模板方法。
3、一次性实现一个算法的不变的部分,并将可变的为留给子类来实现。
4、实现一个算法时,整体步骤很固定。但是某些部分易变,这部分可以抽象出来,留给子类去实现。

常见案例

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

2、Spring IOC容器初始化时

优点

1、封装不变部分,扩展可变部分。
2、提取公共代码,便于维护。
3、行为由父类控制,子类实现。

缺点

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

实现步骤

步骤 1

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

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


package com.pattern.template_method;

/**
 * Created by chen on 2018/3/19.
 * 

* Email [email protected] *

* 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
 * 

* Email [email protected] *

* 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.
 * 

* Email [email protected] *

* 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
 * 

* Email [email protected] *

* 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/act/ambassador/sharetouser.html?userCode=vf2b5zld&utm_source=vf2b5zld

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

一看就懂的设计模式--模板方法_第2张图片
1.png

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

一看就懂的设计模式--模板方法_第3张图片
1.jpg

你可能感兴趣的:(一看就懂的设计模式--模板方法)