注:本文为译文,原文出处java-design-patterns-in-stories
模板方法模式定义了用于实现特定操作的工作流. 它允许子类去修改特定的步骤, 而无需修改工作流结果.
下面的例子演示了模板方法是如何工作的.
Vehicle.java
定义了交通工具以及它如何工作
package com.programcreek.designpatterns.templatemethod;
abstract public class Vehicle {
//set to protected so that subclass can access
protected boolean status;
abstract void start();
abstract void run();
abstract void stop();
public void testYourVehicle(){
start();
if(this.status){
run();
stop();
}
}
}
Car.java
是Vehicle
的子类并且定义了具体的方法
package com.programcreek.designpatterns.templatemethod;
public class Car extends Vehicle {
@Override
void start() {
this.status = true;
}
@Override
void run() {
System.out.println("Run fast!");
}
@Override
void stop() {
System.out.println("Car stop!");
}
}
Truck.java
是Vehicle
的子类并且定义了具体方法
package com.programcreek.designpatterns.templatemethod;
public class Truck extends Vehicle {
@Override
void start() {
this.status = true;
}
@Override
void run() {
System.out.println("Run slowly!");
}
@Override
void stop() {
System.out.println("Truck stop!");
}
}
testVehicle
方法只接受Vehicle
作为参数, 它不关心交通工具是否是汽车或卡车, 因为它们的工作方式相同. 下面是一个面向接口编程的例子.
import com.programcreek.designpatterns.templatemethod.Car;
import com.programcreek.designpatterns.templatemethod.Truck;
import com.programcreek.designpatterns.templatemethod.Vehicle;
public class Main {
public static void main(String args[]){
Car car = new Car();
testVehicle(car);
Truck truck = new Truck();
testVehicle(truck);
}
public static void testVehicle(Vehicle v){
v.testYourVehicle();
}
}
这个模式应用在了Spring框架中的数据访问对象(DAO)上. org.springframework.jdbc.core.JdbcTemplate类包含所有与JDBC工作流相关的公有重复的代码块, 例如: update, query, execute等.