模版方法模式在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中。模版方法使得子类可以在不改变算法
结构的情况下,重新定义算法中某些步骤的具体实现。一般模板方法模式都会在方法上加final。
public abstract class DriverTemplate {
public final void drive(){
openDoor();
startEngine();
gear();
go();
brake();
stop();
}
protected abstract void openDoor();
protected void startEngine(){
System.out.println("engine started!");
}
protected abstract void gear();
protected void go(){
System.out.println("running...");
}
protected abstract void brake();
protected void stop(){
System.out.println("stopped!");
}
}
public class SuzukiScross extends DriverTemplate{
@Override
protected void brake() {
// TODO Auto-generated method stub
System.out.println("brake with foot");
}
@Override
protected void gear() {
// TODO Auto-generated method stub
System.out.println("gear with hand");
}
@Override
protected void openDoor() {
// TODO Auto-generated method stub
System.out.println("keyless entry");
}
}
public class SuzukiStrom1000 extends DriverTemplate{
@Override
protected void brake() {
// TODO Auto-generated method stub
System.out.println("brake with hand");
}
@Override
protected void gear() {
// TODO Auto-generated method stub
System.out.println("gear with foot");
}
@Override
protected void openDoor() {
// TODO Auto-generated method stub
System.out.println("no door actually");
}
}
public class MyTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
DriverTemplate template = new SuzukiStrom1000();
// DriverTemplate template = new SuzukiScross();
template.drive();
}
}
模版方法模式使用注意几点
1.保护抽象类中定义算法顺序的方法不被子类修改。
2.分离可变及不可变部分,让子类自己决定可变部分的实现。
3.让算法的具体实现对子类开放,对其他类关闭。
public abstract class AbstractCake {
protected abstract void shape();
protected abstract void apply();
protected abstract void brake();
}
class CreamCake extends AbstractCake{
@Override
protected void apply() {
// TODO Auto-generated method stub
System.out.println("奶油蛋糕涂抹");
}
@Override
protected void brake() {
// TODO Auto-generated method stub
System.out.println("奶油蛋糕烘培");
}
@Override
protected void shape() {
// TODO Auto-generated method stub
System.out.println("奶油蛋糕造型");
}
}
class CheeseCake extends AbstractCake{
@Override
protected void apply() {
// TODO Auto-generated method stub
System.out.println("芝士蛋糕涂抹");
}
@Override
protected void brake() {
// TODO Auto-generated method stub
System.out.println("芝士蛋糕烘培");
}
@Override
protected void shape() {
// TODO Auto-generated method stub
System.out.println("芝士蛋糕造型");
}
class MouseCake extends AbstractCake{
@Override
protected void apply() {
// TODO Auto-generated method stub
System.out.println("慕斯蛋糕涂抹");
}
@Override
protected void brake() {
// TODO Auto-generated method stub
System.out.println("慕斯蛋糕烘培");
}
@Override
protected void shape() {
// TODO Auto-generated method stub
System.out.println("慕斯蛋糕造型");
}
}
}
abstract class AbstractCake{
protected boolean shouldApply(){
return true;
}
protected abstract void shape();
protected abstract void apply();
protected abstract void brake();
public final void run(){
this.shape();
if(this.shouldApply()){
this.apply();
}
this.brake();
}
}
class SmallCake extends AbstractCake {
private boolean flag = false;
public void setFlag(boolean shouldApply){
flag = shouldApply;
}
@Override
protected boolean shouldApply() {
return this.flag;
}
@Override
protected void shape() {
System.out.println("小蛋糕造型");
}
@Override
protected void apply() {
System.out.println("小蛋糕涂抹");
}
@Override
protected void brake() {
System.out.println("小蛋糕烘焙");
}
}