设计模式--模版模式

个人感觉模版设计模式比较简单,也比较实用,实际项目组用到的此类模式也比较多。

一、设计模式名整体概述

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 }
View Code

     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 }
View Code

     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 }
View Code

    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 }
View Code

执行结果

Concrete1Class: 执行第1步
Concrete1Class: 执行第2步
Concrete1Class: 执行第3步
========================
Concrete2Class: 执行第1步
Concrete2Class: 执行第2步
Concrete2Class: 执行第3步
View Code

三、设计模式例子

此业务场景为:一个系统分别要调用汽车厂商、票据系统的交易;调用的接口需要设置为统一处理的流程,在调用交易前需要封装数据,调用接口后,根据接口的返回类,要处理正确调用成功的情况和失败的情况,随着交易接口的增多,为约束开发人员,可以用模版的方式处理。

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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

执行结果:

组装票据发送前的数据
调用第三方接口中
调用票据成功:把票据返回的结果记录到数据库中
========================
组装发车信息发送前的数据
调用第三方接口中
发车信息发送成功失败,记录异常
View Code

四:总结

暂无,后期补充。

猜你喜欢

转载自www.cnblogs.com/fating/p/12391618.html