Clark To Do The blog of Clark

Java设计模式:模板方法模式

注:本文为译文,原文出处java-design-patterns-in-stories

模板方法模式定义了用于实现特定操作的工作流. 它允许子类去修改特定的步骤, 而无需修改工作流结果.

下面的例子演示了模板方法是如何工作的.

模板方法模式类图

template-method-pattern-class-diagram

模板方法模式Java代码

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.javaVehicle的子类并且定义了具体的方法

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.javaVehicle的子类并且定义了具体方法

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等.

comments powered by Disqus