java设计模式(9):模板方法模式(TemplateMethod)
一,定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
二,类图:
三,通过小例子讲解:
这个模式一般用在程序的步骤比较多,而且有固定的模式,固定的步骤,而每一步的实现又有多种情况,这是我们可以使用TemplateMethod模式。这样可以保证算法骨架的正确性,又将多态运用的非常好。
这里举个人一天要做的事情吧,假如一个人一天要有起床,吃饭,做事情,睡觉四个事项。
1,首先我们看模板类:
- /**
- * 模板方法设计模式中的“模板类”
- * 一般情况下模板类都是一个抽象类
- */
- public abstract class PersonDay {
- /**
- * 在模板方法中编写核心算法,这个算法是不会改变的,这个算法被子类继承,可以得到复用。
- * 模板方法的流程一般不让子类覆盖,不希望子类去重新定义核心算法,所以模板方法通常被final修饰
- */
- public final void day(){
- doGetUp();
- doEatBreakfast();
- doSome();
- doSleep();
- }
- //将行为的具体实现延迟到子类中完成,达到不同的实现效果。
- public abstract void doGetUp();
- public abstract void doEatBreakfast();
- public abstract void doSome();
- public abstract void doSleep();
- }
2,我们来看学生类:
- public class StudentDay extends PersonDay{
- //学生起床
- public void doGetUp(){
- System.out.println("学生起床了,准备上学了")
- }
- //吃早餐
- public void doEatBreakfast(){
- System.out.println("学生吃早餐:牛奶、面包");
- }
- //上学
- public void doSome(){
- System.out.println("学生上课学习");
- }
- //睡觉
- public void doSleep(){
- System.out.println("学生做完功课睡觉");
- }
- }
3,我们来看老师类:
- public class StudentDay extends PersonDay{
- //老师起床
- public void doGetUp(){
- System.out.println("老师起床了,安顿好家人,准备到学校工作")
- }
- //吃早餐
- public void doEatBreakfast(){
- System.out.println("老师早餐:小米粥、油条");
- }
- //教学
- public void doSome(){
- System.out.println("老师上课教学");
- }
- //睡觉
- public void doSleep(){
- System.out.println("老师备完功课睡觉");
- }
- }
其它子类…………
4,看一下测试类,非常简单:
- public class Test {
- public static void main(String[] args) {
- //父类指向子类
- PersonDay d1 = new StudentDay();
- d1.day();
- PersonDay d2 = new WorkerDay();
- d2.day();
- }
- }
- </span>
分析总结:这样我们就利用模板方法完成了这个实例,我们来分析其中的特点吧:
1,将不变的核心算法行为搬移到了父类,去除了子类中的重复代码,并保证了算法的正确性,因为就在父类中写了一次。
2,具体步骤的下放,使多态体现了其中的优势,使代码的扩展性更高!
四,应用:
大家都知道在我们编写Servlet之前需要我们将之在web.xml中进行配置,这样我们才能在jsp向Servlet中传递数据,并从之获取数据,才能完成我们网页的动态显示。但是随着功能的增多,Servlet的增多,就需要我们为每个Servlet进行配置,这样有两个缺点:1,不断的进行web.xml文件配置不仅麻烦而且会使其容量越来越大,负载也会变大;2,每个servlet需要我们继承HttpServlet,这样耦合性比较高。为了解决此,我们这里可以使用模板方法进行解决。
如果根据数据库中的表进行分类的话,我们一般对表的操作可以分成增删改查,四种操作,这里我们进行上移,看模板类:
- /**
- * 模板类,以后编写的servlet类需要继承这个类,而不是httpservlet类了
- * @author Administrator
- */
- public abstract class CommonServlet extends HttpServlet {
- @Override
- //模板方法,定义了算法
- protected void service(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //获取执行的类型
- String operationType=request.getParameter("operationType");
- //判断
- if("insert" .equals(operationType)){
- doInsert(request,response);
- }else if("select".equals(operationType)){
- doSelect(request,response);
- }else if("update".equals(operationType)){
- doUpdate(request,response);
- }else{
- //.......................
- }
- }
- //抽象方法,都需要实现
- protected abstract void doInsert(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
- protected abstract void doSelect(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
- protected abstract void doUpdate(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
- }
- </span>
当然那些增删改查的的servlet就需要继承这个类了:
- public class AuthServlet extends CommonServlet {
- private IAuthService authService=new AuthServiceImpl();
- @Override
- protected void doInsert(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
- //根据不同的表插入方法的具体实现
- }
- @Override
- protected void doSelect(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
- //根据不同表查询方法的具体实现
- }
- @Override
- protected void doUpdate(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
- //根据表的不同,更新方法的具体实现。
- }
- }
- </span>
这里注意我们在jsp页面进行相关功能时,需要我们将operationType执行的类别传过来,方便我们顶层Servlet的判断。这个就是框架抽象的很小很小的一步,但是对于这个模版方法阐释的也是很好的。
java设计模式(9):模板方法模式(TemplateMethod)的更多相关文章
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- Java设计模式应用——模板方法模式
所谓模板方法模式,就是在一组方法结构一致,只有部分逻辑不一样时,使用抽象类制作一个逻辑模板,具体是实现类仅仅实现特殊逻辑就行了.类似科举制度八股文,文章结构相同,仅仅具体语句有差异,我们只需要按照八股 ...
- Java设计模式之模板方法模式(Template Method)
一.含义 定义一个算法中的操作框架,而将一些步骤延迟到子类中.使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤,不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现. 二 ...
- Java设计模式之模板方法模式(Template)
前言: 我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如JDBC中获取连接,关闭连接这些流程是固定不变的,变动的只有设置参数,解析结果集这些是根据不同的实体对象“来做调整”,针对这种拥有 ...
- java设计模式之模板方法模式
模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...
- 从西天取经的九九八十一难来看Java设计模式:模板方法模式
目录 示例 模板方法模式 定义 意图 主要解决问题 适用场景 优缺点 西天取经的九九八十一难 示例 当我们设计一个类时,我们能明确它对外提供的某个方法的内部执行步骤, 但一些步骤,不同的子类有不同的行 ...
- 设计模式之模板方法模式 templateMethod
代码实现 public abstract class BankTemplateMethod { //具体方法 public void takeNumber(){ System.out.println( ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 图解Java设计模式之模板模式
图解Java设计模式之模板模式 豆浆制作问题 模板方法模式基本介绍 模板方法模式原理类图 模板方法模式解决豆浆制作问题 模板方法模式的钩子方法 模板方法模式在Spring框架中的源码分析 模板方法模式 ...
随机推荐
- Java lambda 表达式详解(JDK 8 新特性)
什么是 lambda 表达式 lambda 表达式(拉姆达表达式)是 JAVA 8 中提供的一种新的特性,它使 Java 也能进行简单的"函数式编程". lambda 表达式的本质 ...
- Linux中级之keepalived配置
hacmp: ibm的高可用集群软件,并且是商业的(收费),一般用于非x86架构机器当中 AIX,Unix 去IOE:ibm,oracle,emckeepalived: 一款高可用集群软件,利用vrr ...
- scrapy奇技淫巧1
Request传递值到callback回调函数 def parse(self, response): request = scrapy.Request('http://www.example.com/ ...
- Python中PyQuery库的使用
pyquery库是jQuery的Python实现,可以用于解析HTML网页内容,我个人写过的一些抓取网页数据的脚本就是用它来解析html获取数据的. 它的官方文档地址是:http://packages ...
- 启动dubbo消费端过程提示No provider available for the service的问题定位与解决
文/朱季谦 某次在启动dubbo消费端时,发现无法从zookeeper注册中心获取到所依赖的消费者API,启动日志一直出现这样的异常提示 Failed to check the status of t ...
- SpringMVC=>web.xml基本配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmln ...
- 五种开源API网关实现组件对比
五种开源API网关实现组件对比 API 网关一些实现 使用一个组件时,尤其是这种比较流行的架构,组件肯定存在开源的,我们不必自己去从零开始去实现一个网关,自己开发一个网关的工作量是相当可观的, ...
- Harmony生命周期
Harmony生命周期 系统管理或用户操作等行为,均会引起Page实例在其生命周期的不同状态之间进行转换.Ability类提供的回调机制能够让Page及时感知外界变化,从而正确地应对状态变化(比如释放 ...
- Java静态方法和实例方法的区别以及this的用法
Java静态方法和实例方法 相同之处:都能接收传过来的参数,都能返回参数. 不同之处:有static就是静态方法,静态方法在另外一个类里面,不用new这个静态方法所在的类,也能直接访问这个方法,比较方 ...
- P1522 [USACO2.4]牛的旅行 Cow Tours(Floyd)
题目描述 Farmer John 的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer Joh ...
