模板方法模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差别适合于这种模式,如大话设计模式中说到的考试场景中,每个人的试卷都是一样的,只有答案不一样。这种场景就适合于模板方法模式。我这次自己写的是一个汽车启动的过程,每一种汽车启动的过程都基本是一样的流程,无非是这一过程中存在一些细小差别。
模板方法模式UML图
模板方法模式代码
package com.roc.template; /** * 汽车模型 * 模型模式 * @author liaowp * */ public abstract class CarModel { /** * 汽车启动 */ protected abstract void start(); /** * 停车 */ protected abstract void stop(); /** * 用户并不需要关注你的车怎么启动或者停下来的,可以开可以停就可以啦 */ final public void excet(){ this.start(); this.stop(); } }
package com.roc.template; /** * 大众车 * @author liaowp * */ public class Wcar extends CarModel{ @Override protected void start() { System.out.println("大众车启动 。。。。。。。。突突突"); } @Override protected void stop() { System.out.println("大众车停车。。。。。。。。。"); } }
package com.roc.template; public class Ocar extends CarModel{ @Override protected void start() { System.out.println("奥迪 无匙启动 突突突"); } @Override protected void stop() { System.out.println("奥迪 停车 "); } }
package com.roc.template; /** * 客户端 * @author liaowp * */ public class Client { public static void main(String[] args) { CarModel wcar=new Wcar();//家里的第一辆车,作为用户的我们并不需要关注车怎么启动的.子类变量变为父类。多态 wcar.excet(); //突然家里需要第二辆车了 奥迪 我们也不需要关注他怎么生产启动的 CarModel ocar=new Ocar(); ocar.excet(); } }
模板方法模式适用场景
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke和Johnson所描述过的“重分解以一般化”的一个很好的例子。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
- 控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展。