package 模板方法模式;
public abstract class HummerModel {
public abstract void start();
public abstract void stop();
public abstract void alarm();
public abstract void engineBoom();
public abstract void run();
}
package 模板方法模式;
public class HummerH1Model extends HummerModel{
@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引擎轰鸣声");
}
@Override
public void run() {
//先启动
this.start();
//引擎发声
this.engineBoom();
//鸣笛
this.alarm();
this.stop();
}
}
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引擎发声");
}
@Override
public void run() {
//先启动
this.start();
//引擎发声
this.engineBoom();
//鸣笛
this.alarm();
this.stop();
}
}
- 程序写到这里有一个问题就是两个类的实现run方法相同,因此要把这个run方法抽象到抽象类中,不应该在实现类中写。
代码修改为:
package 模板方法模式;
public abstract class HummerModel {
public abstract void start();
public abstract void stop();
public abstract void alarm();
public abstract void engineBoom();
public void run() {
//先启动
this.start();
//引擎发声
this.engineBoom();
//鸣笛
this.alarm();
this.stop();
}
}
package 模板方法模式;
public class HummerH1Model extends HummerModel{
@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引擎轰鸣声");
}
}
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引擎发声");
}
}
- 模板方法的定义:
定义一个算法的操作框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法某些特定的步骤。
基本方法:由子类实现的方法,并且在模板方法中调用 - 模板方式的应用
模板方式的优点:封装不变部分,扩展可变部分。提取公共部分的代码,便于维护;行为由父类控制,子类实现。 模板方法的应用场景
多个子类有共有的方法,并且逻辑基本相同
重要复杂的算法,可以吧核心的算法设计为模板方法,周边的具体实现的细节可由子类实现。
重构时,模板方法的设计模式是一个经常用的设计模式,把相同的代码抽取到父类中,然后通过钩子函数来约束行为。模板方法模式的扩展
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();
}
}