Java设计模式之模板方法模式(Template Method)
一、含义
定义一个算法中的操作框架,而将一些步骤延迟到子类中。使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤,不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。
二、模式中的角色
抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法
三、类图及源码
模板方法模式的通用类图非常简单,仅仅使用了Java的继承机制,但它是一个非常广泛的模式。其类图如下,其中AbstractClass叫做抽象模板,它的方法分为两类:
- 基本方法:是由子类实现的方法,并且在模板方法被调用。(一般都加上final关键字,防止被覆写)
 - 模板方法:可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调用,完成固定的逻辑。(抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性或方法尽量不要设置为protected类型。实现类若非必要,尽量不要扩大父类中的访问权限)
 

上述通用类图的源码如下:
 public abstract class AbstractClass {
     protected abstract void doAnything();
     protected abstract void doSomething();
     public final void templateMethod(){
         /*
          * 调用基本方法,完成相关的逻辑
          */
         this.doAnything();
         this.doSomething();
     }
 }
 public class ConcreteClass1 extends AbstractClass {
     @Override
     protected void doAnything() {
         // TODO Auto-generated method stub
         //子类实现具体
     }
     @Override
     protected void doSomething() {
         // TODO Auto-generated method stub
     }
 }
 public class ConcreteClass2 extends AbstractClass {
     @Override
     protected void doAnything() {
         // TODO Auto-generated method stub
         //子类实现具体
     }
     @Override
     protected void doSomething() {
         // TODO Auto-generated method stub
     }
 }
四、优缺点
1、模板方法模式的优点
- 封装不变部分,扩展可变部分。把认为不变部分的算法封装到父类中实现,而可变部分的则可以通过继承来继续扩展。
 - 提取公共部分代码,便于维护。
 - 行为由父类控制,子类实现。
 
2、模板方法模式的缺点
按照设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类负责完成具体的事务属性和方法,但是模板方式正好相反,子类执行的结果影响了父类的结果,会增加代码阅读的难度。
五、使用场景
- 多个子类有共有的方法,并且逻辑基本相同
 - 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
 - 重构时,模板方法是一个经常使用的方法,把相同的代码抽取到父类中,然后通过构造函数约束其行为
 
六、实例
以准备去学校所要做的工作(prepareGotoSchool)为例,假设需要分三步:穿衣服(dressUp),吃早饭(eatBreakfast),带上东西(takeThings)。学生和老师要做得具体事情肯定有所区别。
抽象类AbstractClass
 public abstract class AbstractPerson{
      //抽象类定义整个流程骨架
      public void prepareGotoSchool(){
           dressUp();
           eatBreakfast();
           takeThings();
      }
      //以下是不同子类根据自身特性完成的具体步骤
      protected abstract void dressUp();
      protected abstract void eatBreakfast();
      protected abstract void takeThings();
 }
具体类ConcreteClass
     public class Student extends AbstractPerson{
          @Override
          protected void dressUp() {
               System.out.println(“穿校服");
          }
          @Override
          protected void eatBreakfast() {
               System.out.println(“吃妈妈做好的早饭");
          }  
          @Override
          protected void takeThings() {
               System.out.println(“背书包,带上家庭作业和红领巾");
          }
     }  
     public class Teacher extends AbstractPerson{
          @Override
          protected void dressUp() {
               System.out.println(“穿工作服");
          }
          @Override
          protected void eatBreakfast() {
               System.out.println(“做早饭,照顾孩子吃早饭");
          }  
          @Override
          protected void takeThings() {
               System.out.println(“带上昨晚准备的考卷");
          }
     }  
测试类:
 public class Client {
      public static void main(String[] args) {
      Student student = new Student()
      student.prepareGotoSchool();  
      Teacher teacher  = new Teacher()
      teacher.prepareGotoSchool();
      }
 }
Java设计模式之模板方法模式(Template Method)的更多相关文章
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
		
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
 - 二十四种设计模式:模板方法模式(Template Method Pattern)
		
模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...
 - Java设计模式之模板方法模式(Template)
		
前言: 我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如JDBC中获取连接,关闭连接这些流程是固定不变的,变动的只有设置参数,解析结果集这些是根据不同的实体对象“来做调整”,针对这种拥有 ...
 - 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)
		
设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...
 - 设计模式 - 模板方法模式(template method pattern) JFrame 具体解释
		
模板方法模式(template method pattern) JFrame 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(templ ...
 - 模板方法模式 Template method 行为型 设计模式(二十六)
		
模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...
 - 设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释
		
模板方法模式(template method pattern) 排序(sort) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(tem ...
 - 设计模式 - 模板方法模式(template method pattern) 具体解释
		
模板方法模式(template method pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template metho ...
 - 模板方法模式-Template Method(Java实现)
		
模板方法模式-Template Method 在模板模式中, 处理的流程被定义在父类中, 而具体的处理则交给了子类. 类关系图很简单: Template接口 这里定义了子类需要实现的方法(before ...
 - 折腾Java设计模式之模板方法模式
		
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
 
随机推荐
- 分页技巧__设计分页用的QueryHelper辅助对象
			
分页技巧__设计分页用的QueryHelper辅助对象 FROM 必须 实体名 WHERE 可选 条件1 AND 条件2 AND ... 条件n ORDER BY 可选 属性1, 属性2, ... ...
 - 链接href的多重使用
			
1. 拨打电话 在电话号码前面可以加上 + (加号)表示国际号码. <a href="tel:10086">10086</a> 使用wtai协议进行拨打电话 ...
 - std::unique_lock
			
/*与Mutex RAII相关,方便线程上锁,相比std::lock_guard提供了更好的上锁解锁控制,反正我是没看出来也是在构造时上锁,在析构时解锁,感觉和lock_gurad大差不差都是在线程函 ...
 - c++11——多线程
			
c++11中增加了线程以及线程相关的类,很方便的支持了并发编程. 1. 线程 线程创建 使用std::thread创建线程,提供线程函数或者函数对象即可,并且可以指定线程函数的参数. #inc ...
 - python练习题集合-2
			
author:headsen chen date:2018-06-01 15:39:26 习题17,文件的更多操作 [root@localhost py]# echo > cc.txt [ro ...
 - Java调用http保留访问状态
			
package com.coracle; import com.coracle.yk.xframework.util.yunTongXun.HttpRequest; import java.io.*; ...
 - Java中break、continue、return语句的使用区别
			
break.continue.return之间的区别与联系 在软件开发过程中,逻辑清晰是非常之重要的. 代码的规范也是非常重要的.往往细节决定成败.在编写代码的时候,一定要理解语言的作用以及使用的方法 ...
 - Python全栈day9(Python基础)
			
Python基础 一,Windows安装Python3.5 下载地址:https://www.python.org/ftp/python/3.5.2/python-3.5.2rc1-amd64.exe ...
 - CEF3 HTML5 audio标签为什么不能播放mp3格式的音频文件
			
CEF3 HTML5 audio标签 为什么不能播放mp3格式的音频文件 原因略. 解决方法: 找一个最新版的chrome ,我用的是24版本.路径 C:\Documents and Sett ...
 - User Login  Client Identification
			
w用HTTP认证首部注册用户名. HTTP The Definitive Guide Rather than passively trying to guess the identity of a u ...