模板方法模式
模板方法模式(Template Method)
模板方法模式是行为模式之一,它把具体特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为。
1. 模板方法中的角色及其职责
1.1 Abstract Class
抽象类
MakeCar
package com.liuyao;
/**
* @author liuyao
* @date 2018/08/05
*/
public abstract class MakeCar {
/**
* 抽象方法
*/
public abstract void makeHead();
public abstract void makeBody();
public abstract void makeTail();
/**
* 模板方法
*/
public void make(){
makeHead();
makeBody();
makeTail();
}
/**
* 钩子方法
*/
public void run(){
System.out.println("run");
}
}
- 抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。
- 模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。
- 钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。
抽象类的任务是搭建逻辑的框架,通常由经验丰富的人员编写,因为抽象类的好坏直接决定了程序是否稳定性。
1.2 Concrete Class
具体实现子类
MakeBusCar
package com.liuyao;
/**
* @author liuyao
* @date 2018/08/05
*/
public class MakeBusCar extends MakeCar{
@Override
public void makeHead() {
System.out.println("bus head");
}
@Override
public void makeBody() {
System.out.println("bus body");
}
@Override
public void makeTail() {
System.out.println("bus tail");
}
@Override
public void run() {
System.out.println("run in city");
}
}
MakeTruckCar
package com.liuyao;
/**
* @author liuyao
* @date 2018/08/05
*/
public class MakeTruckCar extends MakeCar{
@Override
public void makeHead() {
System.out.println("truck head");
}
@Override
public void makeBody() {
System.out.println("truck body");
}
@Override
public void makeTail() {
System.out.println("truck tail");
}
@Override
public void run() {
System.out.println("run in countryside");
}
}
MakeSUVCar
package com.liuyao;
/**
* @author liuyao
* @date 2018/08/05
*/
public class MakeSUVCar extends MakeCar{
@Override
public void makeHead() {
System.out.println("suv head");
}
@Override
public void makeBody() {
System.out.println("suv body");
}
@Override
public void makeTail() {
System.out.println("suv tail");
}
}
Main
package com.liuyao;
public class Main {
public static void main(String[] args) {
MakeCar bus=new MakeBusCar();
MakeCar truck=new MakeTruckCar();
MakeCar suv=new MakeSUVCar();
bus.make();
bus.run();
System.out.println("===========================");
truck.make();
truck.run();
System.out.println("===========================");
suv.make();
suv.run();
}
}
//bus head
//bus body
//bus tail
//run in city
//===========================
//truck head
//truck body
//truck tail
//run in countryside
//===========================
//suv head
//suv body
//suv tail
//run
2. 应用场景
- 具有统一的操作步骤或操作过程
- 具有不同的操作细节
- 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同