个人感觉模版设计模式比较简单,也比较实用,实际项目组用到的此类模式也比较多。
一、设计模式名整体概述
1:模版设计模式英文单词(TemplateMethod)
2:设计模式角色
A:抽象模版类(AbstractClass):主要用来定义或者规范执行方式与顺序。
B:实现类(ConcreteClass):对抽象模版类的补充。
C:客户类:实用场景
D:设计模式关键思路:模板方法模式也是也是比较容易理解的,比如房产中介带你看房子:1)带看房子 2)下定金 3)网签 4)面签 5)过户。但是同的中介,里边的处理小步骤略有不同
二、设计模式关键思路
1、模版中定义步骤
2、对执行的关键步骤,在模版中统一处理。
最基本模型演示:
A:抽象模版类(AbstractClass):主要用来定义或者规范执行方式与顺序。
1 package comm.pattern.action.templateMethod; 2 3 /** 4 * 5 * @Title: AbstractClass.java 6 * @Package: comm.pattern.action.templateMethod 7 * @Description: 模版类 8 * @author yangzhancheng 9 * @2020年3月1日:下午4:39:49 10 * 11 */ 12 public abstract class AbstractClass { 13 14 //第一步:规定要做什么 15 abstract public void step1(); 16 17 //第二步:规定要做什么 18 abstract public void step2(); 19 20 //第三步:规定要做什么 21 abstract public void step3(); 22 23 //实际执行 24 final public void action(){ 25 step1(); 26 step2(); 27 step3(); 28 } 29 30 31 }
B:实现类(ConcreteClass):对抽象模版类的补充。--实现类1
1 package comm.pattern.action.templateMethod; 2 3 public class Concrete1Class extends AbstractClass{ 4 5 //第一步:规定要做什么 6 public void step1(){ 7 System.out.println("Concrete1Class: 执行第1步"); 8 } 9 10 11 //第二步:规定要做什么 12 public void step2(){ 13 System.out.println("Concrete1Class: 执行第2步"); 14 } 15 16 //第三步:规定要做什么 17 public void step3(){ 18 System.out.println("Concrete1Class: 执行第3步"); 19 } 20 21 22 }
B:实现类(ConcreteClass):对抽象模版类的补充。--实现类2
1 package comm.pattern.action.templateMethod; 2 3 public class Concrete2Class extends AbstractClass{ 4 5 //第一步:规定要做什么 6 public void step1(){ 7 System.out.println("Concrete2Class: 执行第1步"); 8 } 9 10 11 //第二步:规定要做什么 12 public void step2(){ 13 System.out.println("Concrete2Class: 执行第2步"); 14 } 15 16 //第三步:规定要做什么 17 public void step3(){ 18 System.out.println("Concrete2Class: 执行第3步"); 19 } 20 21 22 }
C:客户类:实用场景
1 package comm.pattern.action.templateMethod; 2 3 /** 4 * 5 * @Title: Client.java 6 * @Package: comm.pattern.action.templateMethod 7 * @Description: 描述该文件做什么 8 * @author yangzhancheng 9 * @2020年3月1日:下午4:47:17 10 * 11 */ 12 public class Client { 13 14 public static void main(String[] args) { 15 16 AbstractClass abstract1Class = new Concrete1Class(); 17 abstract1Class.action(); 18 19 System.out.println("========================"); 20 21 AbstractClass abstract2Class = new Concrete2Class(); 22 abstract2Class.action(); 23 24 } 25 26 }
执行结果
Concrete1Class: 执行第1步 Concrete1Class: 执行第2步 Concrete1Class: 执行第3步 ======================== Concrete2Class: 执行第1步 Concrete2Class: 执行第2步 Concrete2Class: 执行第3步
三、设计模式例子
此业务场景为:一个系统分别要调用汽车厂商、票据系统的交易;调用的接口需要设置为统一处理的流程,在调用交易前需要封装数据,调用接口后,根据接口的返回类,要处理正确调用成功的情况和失败的情况,随着交易接口的增多,为约束开发人员,可以用模版的方式处理。
A、抽象模版类(AbstractClass):定义调用外部接口的顺序
1 package comm.pattern.action.templateMethod.ext; 2 3 import java.util.HashMap; 4 5 /** 6 * 7 * @Title: AbstractMessageSender.java 8 * @Package: comm.pattern.action.templateMethod.ext 9 * @Description: 描述该文件做什么 10 * @author yangzhancheng 11 * @2020年3月1日:下午6:06:24 12 * 13 */ 14 public abstract class AbstractMessageSender { 15 16 boolean result ; 17 18 //第一步:预先组装数据 19 abstract public void doBeforer(); 20 21 //第二步:调用第三方接口,本步骤封为标准接口 22 final public boolean doCall(){ 23 System.out.println("调用第三方接口中"); 24 return result; 25 26 } 27 28 //第三步:调用第三方接口成功后如何处理 29 abstract public void doAfterSucess(); 30 31 //第四步:调用第三方接口失败后如何处理 32 abstract public void doAfterFail(); 33 34 //实际执行 35 final public void execute(){ 36 //1. 数据预装 37 doBeforer(); 38 39 40 //2. 调用处理 41 boolean result = doCall(); 42 43 44 //3. 调用后处理 45 if(result){ 46 doAfterSucess(); //调用成功处理 47 }else{ 48 doAfterFail(); //调用失败处理 49 } 50 } 51 52 }
B:汽车实现类,调用汽车厂商的接口。
1 package comm.pattern.action.templateMethod.ext; 2 3 public class CarManger extends AbstractMessageSender{ 4 5 6 public CarManger(boolean result){ 7 super.result = result; 8 } 9 10 //第一步:预先组装数据 11 public void doBeforer(){ 12 System.out.println("组装发车信息发送前的数据"); 13 } 14 15 //第三步:调用第三方接口成功后如何处理 16 public void doAfterSucess(){ 17 System.out.println("发车信息发送成功,记录成功数据到数据库"); 18 } 19 20 //第四步:调用第三方接口失败后如何处理 21 public void doAfterFail(){ 22 System.out.println("发车信息发送成功失败,记录异常"); 23 } 24 25 }
C:票据实现类,调用票据系统的接口。
1 package comm.pattern.action.templateMethod.ext; 2 3 public class BillManger extends AbstractMessageSender{ 4 5 6 public BillManger(boolean result){ 7 super.result = result; 8 } 9 10 11 //第一步:预先组装数据 12 public void doBeforer(){ 13 System.out.println("组装票据发送前的数据"); 14 } 15 16 17 //第三步:调用第三方接口成功后如何处理 18 public void doAfterSucess(){ 19 System.out.println("调用票据成功:把票据返回的结果记录到数据库中"); 20 } 21 22 //第四步:调用第三方接口失败后如何处理 23 public void doAfterFail(){ 24 System.out.println("调用票据成功:把票据失败原因"); 25 } 26 27 }
D、调用方,模拟数据处理
1 package comm.pattern.action.templateMethod.ext; 2 3 /** 4 * 5 * @Title: Client.java 6 * @Package: comm.pattern.action.templateMethod 7 * @Description: 描述该文件做什么 8 * @author yangzhancheng 9 * @2020年3月1日:下午4:47:17 10 * 11 */ 12 public class Client { 13 14 public static void main(String[] args) { 15 16 AbstractMessageSender billManger = new BillManger(true); 17 billManger.execute(); 18 19 System.out.println("========================"); 20 21 AbstractMessageSender cardManger = new CarManger(false); 22 cardManger.execute(); 23 24 } 25 26 }
执行结果:
组装票据发送前的数据 调用第三方接口中 调用票据成功:把票据返回的结果记录到数据库中 ======================== 组装发车信息发送前的数据 调用第三方接口中 发车信息发送成功失败,记录异常
四:总结
暂无,后期补充。