博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板方法模式
阅读量:5081 次
发布时间:2019-06-13

本文共 2827 字,大约阅读时间需要 9 分钟。

什么是模板方法

模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的

      重复代码全部在父类里面,不同业务的,抽取给子类进行实现。抽取过程---抽象方法。

某些特定步骤。

核心:处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,我们采用工厂方法模式,将这个节点的代码实现转移给

子类完成。即:处理步骤在父类中定义好,具体的实现延迟到子类中定义。

说白了,就是将一些相同操作的代码,封装成一个算法的骨架。核心的部分留在子类中操作,在父类中只把那些骨架做好。

例如:

1.去银行办业务,银行给我们提供了一个模板就是:先取号,排对,办理业务(核心部分我们子类完成),给客服人员评分,完毕。

 这里办理业务是属于子类来完成的,其他的取号,排队,评分则是一个模板。

2.去餐厅吃饭,餐厅给提供的一套模板就是:先点餐,等待,吃饭(核心部分我们子类完成),买单

这里吃饭是属于子类来完成的,其他的点餐,买单则是餐厅提供给我们客户的一个模板。

 

什么时候使用模板方法

实现一些操作时,整体步骤很固定,但是呢。就是其中一小部分容易变,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。

 

中应用场景

 其实,各个框架中,都有模板方法模式的影子。

数据库访问的封装、Junit单元测试、servlet中关于doGet/doPost方法的调用

Hibernate中模板程序、spring中JDBCTemplate,HibernateTemplate等等

 

模板方法具体实现

这里使用银行办理业务为例

首先,定义一个模板。模板中把办理业务用作核心部分,让子类来实现。

 

不同的业务抽取到子类去实现

 

首先建立一个模板出来:

先定义一个模板:

package TemplateModel;public abstract class MsgTemplate {      public void sendMsg(){        //1.开始日志报文        addHeadLog();        //2.调用具体不同运营商发送        httpRequest();        //3.结束日志报文        addFootLog();            }    private void addFootLog() {        System.out.println("调用运营商开始记录日志...");            }    public abstract void httpRequest();  //调用不同的运营商 需要暂时不写死 定义为抽象的 同时 类也要定义为抽象的 而且必须public类型的    private void addHeadLog() {        System.out.println("调用运营商结束记录日志... ");            }            }

 

移动:

package TemplateModel;public class YiDong extends MsgTemplate  {   //移动    @Override    public void httpRequest() {        System.out.println("移动运营商的接口");    }    }

联通:

package TemplateModel;public class LianTong extends MsgTemplate{       @Override    public void httpRequest() {        System.out.println("联通运营商的接口");            }}

客户端调用:

package TemplateModel;public class Client {     public static void main(String[] args) {        MsgTemplate yidong = new YiDong();        yidong.sendMsg();    }    }

运行结果:

 

 通过继承关系 继承 

 模板方法可以实现aop功能哈,aop做面向切面编程的,模板方法是把整体业务抽取出来形成一个模板。aop没有模板概念

模板方法整体是个固定的 

 

Servlet中的doGet doPost都是模板方法模式的

 要使用servlet 首先要继承HttpServlet:  HttpServlet源码:

 ====>

HttpServlet是个抽象类,经验判断 在看源码时候 如果看到了抽象类 一般会是 模板方法模式    类里面的抽象方法 到子类中去重写

重写了doPOST方法  其他的业务进行综合集中处理了  图太多我就不给大家一一截图了 大家自己研究下~~

 

 模板方法模式就是定义一个算法的骨架,而将具体的算法延迟到子类中实现

优点: 使用模板方法模式,在定义算法骨架的同时,可以很灵活的实现具体的算法,满足用户灵活多变的需求

缺点: 如果算法骨架有修改的话,则需要修改抽象类

 

package com.toov5.reflact; abstract class getTime{    public final  long getTime() { //不让子类去重写          long start =  System.currentTimeMillis();            code();          long end = System.currentTimeMillis();          return end-start;    } public abstract void code();  //让子类去实现 想怎么写就怎么写}//子类class Demo1 extends getTime{    @Override    public void code() {        for(int i=0; i<10000; i++) {            System.out.println("不惧");        }            }    }  public class ReflectTest9 {   public static void main(String[] args) {     Demo1 demo1 = new Demo1();     System.err.println(demo1.getTime());}   }

 

转载于:https://www.cnblogs.com/toov5/p/9867687.html

你可能感兴趣的文章
Scalaz(2)- 基础篇:随意多态-typeclass, ad-hoc polymorphism
查看>>
c语言之 malloc函数详解
查看>>
JSP连接SQLServer2014(NetBeans + tomcat)
查看>>
layer弹出层框架alert与msg详解
查看>>
1005. Maximize Sum Of Array After K Negations
查看>>
自定义流水号。
查看>>
.Net下的进程间的通讯 -- Windows消息队列
查看>>
Linux下c开发 之 线程通信(转)
查看>>
时间复杂度分析
查看>>
Java 传递参数时,传递一个变量快还是传递一个实体类?
查看>>
解释器模式
查看>>
mysql增加字段,修改字段,增加索引等语句
查看>>
使用Charles进行网络请求抓包解析
查看>>
配置MySQL主从复制和读写分离
查看>>
STM32的bulk双缓冲传输速度的讨论,硬件的坑永远填不完
查看>>
有序数组寻找中位数以及寻找K大元素
查看>>
ES Reindex用java来实现
查看>>
模板复习
查看>>
MongoDB 自己定义函数
查看>>
关于Try/Catch 代码块
查看>>