1:模板方法的定义(定义一个算法的框架将这些算法的步骤延迟到子类中,使得子类可以不改变一个算法的结构可重新定义某些特定的步骤)
2:模板方法的类图:
2.1类图解释:通过类图我们可以看的出来模板方法其实很简单,仅仅使用了一个java的继承机制,其中abstractclass叫做抽象模板。
基本方法:是由子类去实现的,模板方法调用基本的方法
模板方法:可以是一个或者几个,一般是一个具体的方法,也就是一个算法的框架,实现最基本的方法的调用,完成固定的逻辑
注意:为防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写。
2.2模板类图代码的实现
AbstractClass:
package 基本模板方法; public abstract class AbstractClass { protected abstract void doSomething(); protected abstract void doAnything(); protected void templateMethod(){ /** * 调用基本的方法,完成相关的逻辑 */ this.doSomething(); this.doAnything(); } }
子类1:
package 基本模板方法; public class ConcreteClass1 extends AbstractClass{ //实现基本的方法 @Override protected void doSomething() { // TODO Auto-generated method stub //业务的处理 } @Override protected void doAnything() { // TODO Auto-generated method stub //业务的处理 } }
子类2:
package 基本模板方法; public class ConcreteClass2 extends AbstractClass{ //实现基本方法 @Override protected void doSomething() { // TODO Auto-generated method stub //处理业务逻辑 } @Override protected void doAnything() { // TODO Auto-generated method stub //处理业务逻辑 } }
运行类:
package 基本模板方法; public class Client { public static void main(String[] args) { AbstractClass abstractClass1 = new ConcreteClass1(); AbstractClass abstractClass2 = new ConcreteClass2(); //调用模板的方法 abstractClass1.templateMethod(); abstractClass2.templateMethod(); } }
3:模板方法的应用
3.1模板方法的有点
a.封装不变部门,扩展可变部分
b.提取公共组成部分
c.行为由父类控制,子类实现
4:模板方法扩展实例
package 模板方法模式; public abstract class HummerModel { public abstract void start(); public abstract void stop(); public abstract void alarm(); public abstract void engineBoom(); final public void run() { //先启动 this.start(); //引擎发声 this.engineBoom(); //鸣笛 if (isAlarm()) { this.alarm(); } this.stop(); } //钩子函数 protected boolean isAlarm(){ return true; } } package 模板方法模式; public class HummerH1Model extends HummerModel{ private boolean alarmFlag = true;//要喇叭 @Override public void start() { System.out.println("H1启动"); } @Override public void stop() { System.out.println("H1停车"); } @Override public void alarm() { System.out.println("H1鸣笛"); } @Override public void engineBoom() { System.out.println("H1引擎轰鸣声"); } protected boolean isAlarm(){ return this.alarmFlag; } //要不要响喇叭,是有客户控制的 public void setAlarm(boolean isAlarm){ this.alarmFlag = isAlarm; } } package 模板方法模式; public class HummerH2Model extends HummerModel{ @Override public void start() { System.out.println("H2启动"); } @Override public void stop() { System.out.println("H2停车"); } @Override public void alarm() { System.out.println("H2鸣笛"); } @Override public void engineBoom() { System.out.println("H2引擎发声"); } //默认没有喇叭的 public boolean isAlarm(){ return false; } } package 模板方法模式; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Client { public static void main(String[] args) throws IOException { System.out.println("-----H1-----"); String type = (new BufferedReader(new InputStreamReader(System.in))).readLine(); HummerH1Model h1 = new HummerH1Model(); if (type.equals("0")) { h1.setAlarm(false); } h1.run(); System.out.println("-----H2-----"); HummerH2Model h2 = new HummerH2Model(); h2.run(); } }