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();
}
}