全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java设计模式之模板方法模式详解

一、什么是模板方法模式

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

  通俗的讲,模板方法模式是通过把不变行为搬到超类,去除子类里面的重复代码提现它的优势,它提供了一个很好的代码复用平台。当不可变和可变的方法在子类中混合在一起的时候,不变的方法就会在子类中多次出现,这样如果摸个方法需要修改则需要修改很多个,虽然这个这个问题在设计之初就应该想好。这个时候模板方法模式就起到了作用了,通过模板方法模式把这些重复出现的方法搬到单一的地方,这样就可以帮助子类摆脱重复不变的纠缠。

  举个好懂的例子,小时候笔者家里穷,在农村上小学的时候考试都是每个学生手抄试卷,因为那个时候学校还没有试卷印刷。全班五十多个学生每个学生都要重复抄一遍黑板的试卷,并且像笔者这样的近视眼很容易就抄错了,8抄成3,7抄成1等到,然后明明做对了但是分数就是不高,导致笔者一直是全班倒数。这就是个很严重的重复不可变的问题,现在条件好了不少,学生不需要抄试卷,试卷印刷就解决了这个重复抄试卷的问题。模板方法也是类似。

二、模式对比

1、抄试卷模式

笔者就以抄试卷模式为名来阐述重复不变带来的不便,下面会对该模式进行改进。

学生甲抄的试卷

public class TestPaperA {
 //试卷第一题
 public void testQuestion1(){
  System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈");
  System.out.println("答案:C");
 }
 
 //试卷第二题
 public void testQuestion2(){
  System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛");
  System.out.println("答案:C");
 }
 
 //试卷第三题
 public void testQuestion3(){
  System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴");
  System.out.println("答案:B");
 }
}

学生乙抄的试卷

public class TestPaperB {
 //试卷第一题
 public void testQuestion1(){
  System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈");
  System.out.println("答案:A");
 }
 
 //试卷第二题
 public void testQuestion2(){
  System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛");
  System.out.println("答案:C");
 }
 
 //试卷第三题
 public void testQuestion3(){
  System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴");
  System.out.println("答案:D");
 }
}

客户端代码

public class ShowAnswer {

 public static void main(String[] args) {
  System.out.println("学生甲的试卷");
  TestPaperA stuA = new TestPaperA();
  stuA.testQuestion1();
  stuA.testQuestion2();
  stuA.testQuestion3();
  System.out.println("学生乙的试卷");
  TestPaperB stuB = new TestPaperB();
  stuB.testQuestion1();
  stuB.testQuestion2();
  stuB.testQuestion3();
 }

}

很容易发现上面两个学生抄的试卷有很多重复的地方,比如试卷的题目,输出答案的方法,这些都在每个学生试卷类中混合在一起了,既不利于维护,也不利于浏览,下面看一下模板方法模式是怎么改进的。

2、模板方法模式

将每个学生试卷的重复部分提取出来,题目,作答等等。

首先改造试卷类,将该类改为抽象类,在该类中我添加了三个抽象的方法用于子类实现,学生都是要作答的,但是答案不一样,所以可以将作答的过程作为重复不变的方法提取出来,代码如下。

public abstract class TestPaper {
 //试卷第一题
 public void testQuestion1(){
  System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈");
  System.out.println("答案:" + answer1());
 }
 
 //试卷第二题
 public void testQuestion2(){
  System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛");
  System.out.println("答案:" + answer2());
 }
 
 //试卷第三题
 public void testQuestion3(){
  System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴");
  System.out.println("答案:" + answer3());
 }
 
 //这三个钩子方法是给每个子类去实现,并返回答案的
 public abstract String answer1();
 public abstract String answer2();
 public abstract String answer3();
 
 //模板方法,考试的过程,定义基本的考试过程,子类回调
 public void exam(){
  testQuestion1();
  testQuestion2();
  testQuestion3();
 }
}

首先来看第一个学生的考试情况

public class TestPaperA extends TestPaper{

 @Override
 public String answer1() {
  return "A";
 }

 @Override
 public String answer2() {
  return "B";
 }

 @Override
 public String answer3() {
  return "D";
 }
 
}

其他学生的试卷可能答案不是一样的,但是基本的答题过程就是一样的,所以就不重复写了,下面看下客户端代码。

public class ShowAnswer {

 public static void main(String[] args) {
  TestPaper testPaper = new TestPaperA();
  testPaper.exam();
 }

}

可以看待客户端代码也减轻了很多,这样逻辑清晰,利于维护,优势很明显,下面看下具体答题情况。

小龙女是杨过的什么亲戚?() A.小姨妈  B.大姨妈  C.姑妈  D.舅妈
答案:A
全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛
答案:B
《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴
答案:D

3、模板方法模式的基本结构

AbstractClass是一个抽象类,其实就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体的实现,他给出了一些逻辑的骨架,而逻辑的组成在相应的抽象类中,推迟到了子类实现。代码如下

public abstract class AbstractClass {

 //一些抽象行为,可以理解为重复不变的方法,提取到抽象类
 public abstract void primitiveOperation1();
 public abstract void primitiveOperation2();
 
 //模板方法,给出了具体逻辑的骨架,而逻辑的组成是一些相应的抽象操作,他们都推迟到子类实现
 public void templateMothed(){
  primitiveOperation1();
  primitiveOperation2();
 }
 
}

ConcreteClass,实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有一个或者多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法(也就是骨架的组成步骤)的不同实现,从而得到的实现都不同。

public class ConcreteClassA extends AbstractClass{

 @Override
 public void primitiveOperation1() {
  System.out.println("子类A的操作1");
 }

 @Override
 public void primitiveOperation2() {
  System.out.println("子类A的操作2");
 }

}
public class ConcreteClassB extends AbstractClass{

 @Override
 public void primitiveOperation1() {
  System.out.println("子类B的操作1");
 }

 @Override
 public void primitiveOperation2() {
  System.out.println("子类B的操作2");
 }

}

上面定义了两个具体的实现,更多的实现其实都是一致的,这里就不多多说了。下面看下客户端代码

public class Show {

 public static void main(String[] args) {
  AbstractClass c;
  c = new ConcreteClassA();
  c.templateMothed();
  c = new ConcreteClassB();
  c.templateMothed();
 }
 
}

输入如下

子类A的操作1
子类A的操作2
子类B的操作1
子类B的操作2

4、UML图

三、总结

模板方法模式就是为了将重复不变的代码提取到一个抽象类中。当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java  # 设计模式  # 模板方法模式  # Java设计模式之模板方法详解  # Java设计模式之模板方法模式详解  # 深入理解Java设计模式之模板方法模式  # Java设计模式模板方法模式(Template)用法解析  # 一文带你厉害Java设计模式中的模板方法  # 子类  # 类中  # 都是  # 杨过  # 客户端  # 段誉  # 是一个  # 王重阳  # 慕容复  # 全真教  # 大姨妈  # 出了  # 作答  # 多个  # 就不  # 很容易  # 搬到  # 抽象类  # 是个  # 也不 


相关文章: 如何选择高性价比服务器搭建个人网站?  如何选购建站域名与空间?自助平台全解析  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  如何在搬瓦工VPS快速搭建网站?  网站设计制作企业有哪些,抖音官网主页怎么设置?  建站主机空间推荐 高性价比配置与快速部署方案解析  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  如何用花生壳三步快速搭建专属网站?  如何高效生成建站之星成品网站源码?  如何选择网络建站服务器?高效建站必看指南  已有域名和空间如何搭建网站?  定制建站是什么?如何实现个性化需求?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  建站之星如何通过成品分离优化网站效率?  七夕网站制作视频,七夕大促活动怎么报名?  如何用PHP快速搭建CMS系统?  如何通过IIS搭建网站并配置访问权限?  如何在阿里云部署织梦网站?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  太平洋网站制作公司,网络用语太平洋是什么意思?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  如何用免费手机建站系统零基础打造专业网站?  网站专业制作公司有哪些,做一个公司网站要多少钱?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  SQL查询语句优化的实用方法总结  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何在建站之星绑定自定义域名?  如何通过虚拟主机空间快速建站?  如何确认建站备案号应放置的具体位置?  建站DNS解析失败?如何正确配置域名服务器?  如何在橙子建站中快速调整背景颜色?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  如何用低价快速搭建高质量网站?  宁波免费建站如何选择可靠模板与平台?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  如何正确选择百度移动适配建站域名?  如何在Windows 2008云服务器安全搭建网站?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何在建站宝盒中设置产品搜索功能?  威客平台建站流程解析:高效搭建教程与设计优化方案  实惠建站价格推荐:2025年高性价比自助建站套餐解析  Android滚轮选择时间控件使用详解  高端建站三要素:定制模板、企业官网与响应式设计优化  如何确保西部建站助手FTP传输的安全性?  建站之星会员如何解锁更多建站功能?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。