模式是一个解决方案,一个模式解决了一类特定的问题,当我们再次遇到同样的问题时,我们仍然可以使用它解决同样的问题,这里介绍使用模板方法设计模式。
在开发中我们时常可以使用模板方法设计模式,这里我们就以简单的上班为例。上班一族每个工作日去上班都要经过 洗漱---上班方式(交通工具)--开始工作 三个步骤,我们写一个程序来模拟这个过程
public class Work { public void doWork() { //洗漱过程 System.out.println("洗漱。。。。。。"); //去公司过程 System.out.println("上班方式:地铁。。。。。。"); //工作过程 System.out.println("开始工作。。。。。。"); } }
然后有些人上班是走路,骑自行车,公交等等方式去上班,但不论选择何种交替工具,都得先洗漱,最后工作。当需要公交上班时,很容易想到由于只是交通工具不同,我们可以把Work类快速复制一份,只需要把
公交换成公交,如:
public void doWork() { //洗漱过程 System.out.println("洗漱。。。。。。"); //去公司过程 System.out.println("上班方式:公交。。。。。。"); //工作过程 System.out.println("开始工作。。。。。。"); }
复制黏贴看起来很实用,但是这些类会变得难以维护,如果公共部分洗漱需要更改,这需要把类一个个进行更改,所以我们需要好好思考复制黏贴真的好用吗?
我们都知道软件开发,变化时永恒的,软件维护始终贯穿软件开发整个过程。为了提高软件的维性,我们在软件开发中应该遵守DRY这一重要原则。
DRY(Don‘t Repeat Yourself)不要复制自己,为了使软件更加健壮,易于阅读和维护,应遵守该原则,不要编写重复的代码,给维护代理麻烦。
上面的情形,我们可以使用模板方法设计模式来解决。
1.构建Work抽象父类
public abstract class Work { //定义final,不被子类重写 public final void clean() { //洗漱过程 System.out.println("洗漱。。。。。。"); } //去上班方式 public abstract void goCompany(); public final void work() { //工作过程 System.out.println("开始工作。。。。。。"); } }
2.子类继承抽象父类,实现自己的上班方式
public class Subway extends Work{ @Override public void goCompany() { //去公司过程 System.out.println("上班方式:地铁。。。。。。"); } }
使用模板方法设计模式能够解决代码冗余,易于扩展。
模板方法设计模式应用很广泛,但是过分的使用模板设计模式往往会导致类爆炸(子类泛滥)。如查询数据库数据并对查询结果进行处理。整个过程可以分为三步
1.创建数据库连接对象
2.创建Statement实例执行查询操作
3.处理查询结果
发现整个过程中1,2步是相同的,不同的主要是对查询结果进行操作上。这里使用模板方法设计模式你会发现,由于查询的种类很多,导致需要创建很多子类来处理查询结果,会导致子类泛滥。为了解决这一问题,需要结合接口回调来处理,使用java的匿名内部类来完成查询结果的处理。
1.定义父类
package com.longpo.template; public class Work { public final void Connect() { System.out.println("连接数据库。。。。。。"); } public void statement() { System.out.println("Statement实例。。。。。。"); } public void handler(CallBack callBack){ this.Connect(); this.statement(); callBack.HanderResult("处理查询结果。。。。。。"); } //回调接口 public interface CallBack { public void HanderResult(String result); } }
2.测试
public class Person extends Work{ public static void main(String[] args) { Person person =new Person(); person.handler(new CallBack() { @Override public void HanderResult(String result) { System.out.println(result); } }); } }
运行结果:
相关推荐
Head First 设计模式 (八) 模板方法模式(Template Method pattern) C++实现
Java模板方法设计模式[定义].pdf
设计模式之模板方法模式,这份文档以例子的形式介绍了模板方法模式
第05章 面向对象(下) 10 抽象类应用之模板方法设计模式
设计模式--模板方法模式java例子
设计模式的模板方法模式的例子,希望对大家有用~~~~~~~~
介绍模板方法(TemplateMethod)定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某
模板方法设计模式,内含代码和注释还有模板方法的设计原理
适合20分钟左右讲解的模板方法模式。 自己上课用的。
设计模式模板方法模式PPT学习教案.pptx
设计模式-模板方法模式(讲解及其实现代码)
设计模式C++学习之模板方法模式(Template Method)
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式...这种类型的设计模式属于行为型模式。 模板方法模式 java demo
本文实例讲述了PHP设计模式之模板方法模式。分享给大家供大家参考,具体如下: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板...
设计模式之模板方法模式Java实现和UML类设计图
将《Head First 设计模式》(中文版)按章节进行了分割,每章一个文件,方便大家下载。
Java设计模式之模板方法模式.rarJava设计模式之模板方法模式.rar
模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。