模板方法模式 人的一生应该这样度过
模板方法模式应用场景举例:
有一天GG和MM非常认真的说,人的一生基本分为以下几个阶段:
幼年阶段:幼年时期的人主要学校任务是学习讲话。
儿童阶段:人要进行基础的学习。
少年阶段:人仍然主要是学习,而且学习的难度加大了。
青年阶段:学习和工作。
中年阶段:主要是总结以前的学习,并且从中学到更多的知识。
老年阶段:老人需要平静和学习,学习会是老年人延缓衰老。
GG说,每一个人生阶段都有自己的特点和应该做的事情,我们俩现在都处于青年阶段初期,要好好学习啊,当然了也要好好的珍惜我的真情,因为明天不可预测,所以我们今天要全力相爱^_^
模板方法模式解释:
模板方法模式(Template Method Pattern):定义一个操作中算法的骨架(或称为顶级逻辑),将一些步骤(或称为基本方法)的执行延迟到其子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
英文定义为:Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.。
模板方法模式的UML图:
模板方法模式所涉及的角色如下:
抽象类(AbstractClass):定义了一到多个的抽象方法,以供具体的子类来实现它们;而且还要实现一个模板方法,来定义一个算法的骨架。该模板方法不仅调用前面的抽象方法,也可以调用其他的操作,只要能完成自身的使命。
具体类(ConcreteClass):实现父类中的抽象方法以完成算法中与特定子类相关的步骤。
组合模式的UML图如下 所示:
模板方法模式深入分析:
有人说,如果你只会一个设计模式的话,那么这个设计模式就一定是模板方法模式。
模板方法模式是一种非常简单的设计模式,但是也应用非常广泛的设计模式。模板方法模式采用继承的方式实现算法的异构,其关键点就是将通用算法封装在抽象基类中,并将不同的算法细节放到子类中实现。
模板方法模式获得一种反向控制结构的效果,这也是面向对象系统的分析和设计中一个原则DIP(依赖倒置:Dependency Inversion Principles)。其含义就是父类调用子类的操作(高层模块调用低层模块的操作),低层模块实现高层模块声明的接口。这样控制权在父类(高层模块),低层模块反而要依赖高层模块。
模板方法模式使用场景分析及代码实现:
在上面的使用场景中,人的一生可以看着抽象类,而MM和GG就是具体类了。UML图如下所示:
建立抽象模板:
1 /* 2 * 人的一生 3 */ 4 public abstract class Life { 5 6 //幼年时期 7 public abstract void babyhood(); 8 9 //童年时期 10 public abstract void childhood(); 11 12 //少年时期 13 public abstract void youngster(); 14 15 //幼年时期 16 public abstract void youth(); 17 18 //童年时期 19 public abstract void middle(); 20 21 //少年时期 22 public abstract void elderly(); 23 24 public void live() { 25 26 this.babyhood(); 27 28 this.childhood(); 29 30 this.youngster(); 31 32 this.youth(); 33 34 this.middle(); 35 36 this.elderly(); 37 38 } 39 40 }
建立GG具体类:
1 /* 2 * GG的模板实现 3 4 */ 5 public class GG extends Life { 6 7 public void childhood() { 8 System.out.println("GG:儿童阶段的人要进行基础的学习。"); 9 } 10 11 public void babyhood() { 12 System.out.println("GG:幼年阶段的人主要学校任务是学习讲话。"); 13 } 14 15 public void youngster() { 16 System.out.println("GG:少年阶段的人仍然主要是学习,而且学习的难度加大了。"); 17 18 } 19 20 public void elderly() { 21 System.out.println("GG:老年阶段老人需要平静和学习,学习会是老年人延缓衰老。"); 22 } 23 24 public void middle() { 25 System.out.println("GG:中年阶段主要是总结以前的学习,并且从中学到更多的知识。"); 26 } 27 28 public void youth() { 29 System.out.println("GG:青年阶段的主要任务学习和工作。"); 30 } 31 }
建立MM具体类:
1 /* 2 * MM的模板实现 3 */ 4 public class MM extends Life { 5 6 public void childhood() { 7 System.out.println("MM:儿童阶段的人要进行基础的学习。"); 8 } 9 10 public void babyhood() { 11 System.out.println("MM:幼年阶段的人主要学校任务是学习讲话。"); 12 } 13 14 public void youngster() { 15 System.out.println("MM:少年阶段的人仍然主要是学习,而且学习的难度加大了。"); 16 } 17 18 public void elderly() { 19 System.out.println("MM:老年阶段老人需要平静和学习,学习会是老年人延缓衰老。"); 20 } 21 22 public void middle() { 23 System.out.println("MM:中年阶段主要是总结以前的学习,并且从中学到更多的知识。"); 24 } 25 26 public void youth() { 27 System.out.println("MM:青年阶段的主要任务学习和工作。"); 28 } 29 }
建立一个测试客户端:
1 /* 2 * 测试客户端 3 */ 4 public class TemplateMethodTest { 5 6 public static void main(String[] args) { 7 System.out.println("-----------------------------------------------------"); 8 Life gg = new GG(); 9 gg.live(); 10 System.out.println("-----------------------------------------------------"); 11 12 Life mm = new MM(); 13 mm.live(); 14 System.out.println("-----------------------------------------------------"); 15 } 16 }
1 ----------------------------------------------------- 2 3 GG:幼年阶段的人主要学校任务是学习讲话。 4 5 GG:儿童阶段的人要进行基础的学习。 6 7 GG:少年阶段的人仍然主要是学习,而且学习的难度加大了。 8 9 GG:青年阶段的主要任务学习和工作。 10 11 GG:中年阶段主要是总结以前的学习,并且从中学到更多的知识。 12 13 GG:老年阶段老人需要平静和学习,学习会是老年人延缓衰老。 14 15 ----------------------------------------------------- 16 17 MM:幼年阶段的人主要学校任务是学习讲话。 18 19 MM:儿童阶段的人要进行基础的学习。 20 21 MM:少年阶段的人仍然主要是学习,而且学习的难度加大了。 22 23 MM:青年阶段的主要任务学习和工作。 24 25 MM:中年阶段主要是总结以前的学习,并且从中学到更多的知识。 26 27 MM:老年阶段老人需要平静和学习,学习会是老年人延缓衰老。 28 29 -----------------------------------------------------
模板方法模式的优缺点分析:
优点:
使用模板方法模式,在定义算法的骨架的同时,可以很灵活地实现具体的算法,满足用户灵活多变的需求
缺点:
虽然使用模板方法模式可以很自由的实现具体的算法,但如果算法的骨架有改变的话,这需要改变抽象类。
模板方法模式的实际应用简介:
模板模式适用于以下的情况:
第一:一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
第二:各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。其实这可以说是一种好的编码习惯了。
第三:控制子类扩展。模板方法只在特定点调用操作,这样就只允许在这些点进行扩展。如果你不愿子类来修改你的模板方法定义的框架,你可以采用两种方式来做:一是在API中不体现出你的模板方法;二、将你的模板方法置为final就可以了。可以看出,使用模板方法模式可以将代码的公共行为提取出来,达到复用的目的。而且,在模板方法模式中,是由父类的模板方法来控制子类中的具体实现。这样你在实现子类的时候,根本不需要对业务流程有太多的了解。
温馨提示:
模板方法模式是一种运用非常广泛的设计模式,在Servlet和很多著名的框架中都有大量的应用。一般而且,在我们使用框架的时候,往往都是框架给我们实现设计好了算法骨架,同时也实现了一些事务、权限控制等,我们要做的就是按照事先规划好的流程,实现相应的业务方法。
对人的一生而言,每个阶段都有自己的重心,对GG和MM而言,肯定是应该好好学习的。同时,二人应该努力的相爱。韶华易逝啊O(∩_∩)O哈哈~