当我们要重复实现的一个过程或者一系列步骤中,这些过程或步骤都高度相似,也就是整个流程都很一致,但只是个别步骤在某些更详细的层次上的实现可能不同时,通常使用模板方法模式来处理;
一个类要想成为子类的模板,所有重复的代码都要上升到父类中去,而不是让每个子类重复去实现;
模板方法模式:定义一个操作中的流程步骤,而将一些步骤延迟到子类中。
模板方法使得子类可以不改变一个算法的结构,但能够重新定义该算法的某些特定步骤。

一、具体使用方式如下:
- 1.AbstractTemplate是一个抽象类,其实就是一个抽象模板,定义并实现了一个模板方法;这个模板方法是一个具体的方法,给出了一个顶级的逻辑骨架,而逻辑的具体组成封装到抽象中,推迟到子类中实现。
/**
* Created by serenitynanian on 2018/6/5.
* 模板方法模式
*/
public abstract class AbstractTemplate {
/**
* 一些抽象的具体行为,延迟到子类中去实现
*/
public abstract void primitiveOperateOne();
public abstract void primitiveOperateTwo();
/**
* 模板方法:给出了逻辑的骨架,而逻辑的组成是一些抽象的操作,
* 具体的实现延迟到子类中;
*
* 备注:骨架整体调用逻辑不能修改,但是能够根据不同的需求;
*/
public void templateMethod(){
primitiveOperateOne();
primitiveOperateTwo();
System.out.println("执行了模板方法");
}
}
- ConcreteSub实现模板抽象类中的抽象方法,每一个AbstractTemplate都可以有任意多个ConcreteSub类,而每个ConcreteSub都可以实现不同的业务逻辑;
/**
* Created by serenitynanian on 2018/6/5.
* 实现模板抽象类中的抽象方法,每一个AbstractTemplate都可以有任意多个ConcreteSub类,
* 而每个ConcreteSub都可以实现不同的业务逻辑
*/
public class ConcreteSubA extends AbstractTemplate {
@Override
public void primitiveOperateOne() {
System.out.println("实现类中primitiveOperateOne方法的逻辑执行");
}
@Override
public void primitiveOperateTwo() {
System.out.println("实现类中primitiveOperateTwo方法的逻辑执行");
}
}
- 3.具体使用方式
public class Test {
public static void main(String[] args) {
AbstractTemplate abstractTemplate ;
abstractTemplate = new ConcreteSubA();
abstractTemplate.templateMethod();
abstractTemplate = new ConcreteSubB();
abstractTemplate.templateMethod();
}
}
二、总结
- 1.模板方法模式就是把不变的行为放到父类中,去除子类中的重复代码来体现它的优势;
- 2.模板方法模式就是提供一个很好的代码复用平台;
网友评论