吉雪萍微博,尹时允整容前后照片,梦见风沙
所谓模板方法模式,其实很简单,可以从模板的角度考虑,就是一个对模板的应用,就好比老师出试卷,每个人的试卷都是一样的,即都是从老师的原版试卷复印来的,这个原版试卷就是一个模板,可每个人写在试卷上的答案都是不一样的,这就是模板方法模式,是不是很好理解。它的主要用途在于将不变的行为从子类搬到超类,去除了子类中的重复代码。
模板方法模式(templatemethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。uml结构图如下:
其中,abstractclass实现类一个模板方法,定义了算法的骨架,具体子类将重定义primitiveoperation以实现一个算法的步骤;而concreteclass实现了primitiveoperation以完成算法中与特定子类相关的步骤。
定义一个模板方法来组合primitiveoperation1()和primitiveoperation2()两个方法形成一个算法,然后让子类重定义这两个方法。
1 public abstract class abstractclass { 2 3 public abstract void primitiveoperation1(); 4 public abstract void primitiveoperation2(); 5 6 public void templatemethod() { 7 primitiveoperation1(); 8 primitiveoperation2(); 9 } 10 11 }
这里定义两个具体模板类,concreteclassa及concreteclassb来进行测试,继承抽象模板类,实现具体方法。
1 public class concreteclassa extends abstractclass { 2 3 @override 4 public void primitiveoperation1() { 5 system.out.println("具体方法a方法1实现"); 6 } 7 8 @override 9 public void primitiveoperation2() { 10 system.out.println("具体方法a方法2实现"); 11 } 12 13 }
通过调用模板方法来分别得到不同的结果。
1 public class client { 2 3 public static void main(string[] args) { 4 abstractclass abstractclass; 5 6 abstractclass = new concreteclassa(); 7 abstractclass.templatemethod(); 8 9 abstractclass = new concreteclassb(); 10 abstractclass.templatemethod(); 11 } 12 13 }
运行结果如下:
下面就以上方提到的做试卷为例,具体实现一下以说明如何将模板方法模式应用在实际案例中,uml图如下:
如下在抽象类中定义三个普通方法代表试卷的问题,再定义三个抽象方法代码试题答案。
1 public abstract class testpaper { 2 3 //问题 4 public void question1() { 5 system.out.println("1+1=?"); 6 system.out.println("答案:" + answer1()); 7 } 8 9 public void question2() { 10 system.out.println("2+2=?"); 11 system.out.println("答案:" + answer2()); 12 } 13 14 public void question3() { 15 system.out.println("3+3=?"); 16 system.out.println("答案:" + answer3()); 17 } 18 19 //答案 20 protected abstract string answer1(); 21 22 protected abstract string answer2(); 23 24 protected abstract string answer3(); 25 }
下面定义一个学生甲的试卷,学生乙的试卷与之相比只是返回的答案不同。
1 public class testpapera extends testpaper { 2 3 @override 4 protected string answer1() { 5 return "2"; 6 } 7 8 @override 9 protected string answer2() { 10 return "4"; 11 } 12 13 @override 14 protected string answer3() { 15 return "6"; 16 } 17 18 }
基于同一个模板,学生甲乙分别进行答题,得到不一样的结果。
1 public class client { 2 3 public static void main(string[] args) { 4 system.out.println("学生甲的试卷:"); 5 testpaper studenta = new testpapera(); 6 studenta.question1(); 7 studenta.question2(); 8 studenta.question3(); 9 10 //分隔符 11 system.out.println("------------------------------------------------"); 12 13 system.out.println("学生乙的试卷:"); 14 testpaper studentb = new testpaperb(); 15 studentb.question1(); 16 studentb.question2(); 17 studentb.question3(); 18 } 19 20 }
运行结果如下:
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
源码地址:https://gitee.com/adamjiangwh/gof
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
java多线程定时器和java判断一个时间是否在时间区间内和用正则表达式获取String字符串之间的数据
网友评论