本文共 2423 字,大约阅读时间需要 8 分钟。
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
或者 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使的子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。将主要的方法定义为final,防止子类修改算法骨架,将子类必须实现的方法定义为abstract。而普通的方法(无final或abstract修饰)则称之为钩子。行为型模式
1、有多个子类共有的方法,且逻辑相同。
2、重要的、复杂的方法,可以考虑作为模板方法。 3、一次性实现一个算法的不变的部分,并将可变的为留给子类来实现。 4、实现一个算法时,整体步骤很固定。但是某些部分易变,这部分可以抽象出来,留给子类去实现。1、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
2、Spring IOC容器初始化时
1、封装不变部分,扩展可变部分。
2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
创建一个抽象类,它的模板方法被设置为 final,这样这个方法就不能被重写。这个方法里的执行代码步骤也将固定
demo中创建了一个婚姻模板 第一步 认识 ,第二步 热恋 , 第三步 结婚
但是每个人认识的地方,情节不同。package com.pattern.template_method;/** * Created by chen on 2018/3/19. ** Email 122741482@qq.com *
* Describe: 创建一个抽象类,它的模板方法被设置为 final */public abstract class Marriage {
/** * */ abstract void acquaintance(); abstract void amativeness(); abstract void marry(); //婚姻 模板 模板方法被设置为 final 不被继承 public final void run() { //相识 acquaintance(); //恋爱 amativeness(); //结婚 marry(); }}
扩展抽象类,实现了张三 和李四的 婚姻模板
张三package com.pattern.template_method;/** * * @author chen * @date 2018/3/19 ** Email 122741482@qq.com *
* 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 122741482@qq.com *
* Describe: */public class LiSi 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;/** * @author chen * @date 2018/3/19 ** Email 122741482@qq.com *
* Describe: */public class TemplateMethodDemo {
public static void main(String[] args) { Marriage zs = new ZhangSan(); zs.run(); Marriage ls = new LiSi(); ls.run(); }}
查看输出
在公园认识在西湖热恋在阿尔卑斯山结婚在酒吧认识在酒店热恋在法国结婚
我的官网
我的CSDN地址 我的简书地址 我的github 我的码云地址 阿里云优惠券转载地址:http://dqoab.baihongyu.com/