一、定义
模板模式又名模板方法模式,父类定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。
例如,一个互联网产品开发过程中,有需求调研,原型输出,代码开发,测试,结项怎么几部分,所以我们可以将这几大步骤放到父类中定义,但是具体如何调研,如何开发,测试则是可以放到子类实现。
二、优缺点
优点
1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
三、应用场景
- 算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
- 当多个子类存在公共的行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。
四、代码结构
package temolate;
/**
* @Package: temolate
* @ClassName: AbstractTemlateClass
* @Author: tanp
* @Description: 抽象模板父类
* @Date: 2020/11/25 15:50
*/
public abstract class AbstractTemplateClass {
/**父类中定义好方法架构*/
public void templateMethod(){
operation1();
operation2();
}
protected abstract void operation1();
protected abstract void operation2();
}
package temolate;
/**
* @Package: temolate
* @ClassName: ConcreteTemplateClassA
* @Author: tanp
* @Description: 实现子类
* @Date: 2020/11/25 15:54
*/
public class ConcreteTemplateClassA extends AbstractTemplateClass{
@Override
protected void operation1() {
System.out.println("先执行这个aaaaaaaaaaa");
}
@Override
protected void operation2() {
System.out.println("后执行这个bbbbbbbbbbbbbbbb");
}
}
package temolate;
/**
* @Package: temolate
* @ClassName: ConcreteTemplateClassB
* @Author: tanp
* @Description: 实现子类
* @Date: 2020/11/25 15:54
*/
public class ConcreteTemplateClassB extends AbstractTemplateClass{
@Override
protected void operation1() {
System.out.println("先执行这个cccccccccccccccccccc");
}
@Override
protected void operation2() {
System.out.println("后执行这个ddddddddddddddddddddddddddd");
}
}
package temolate;
/**
* @Package: temolate
* @ClassName: DemoClient
* @Author: tanp
* @Description: ${description}
* @Date: 2020/11/25 15:56
*/
public class DemoClient {
public static void main(String[] args) {
AbstractTemplateClass abstractTemplateClass = new ConcreteTemplateClassA();
abstractTemplateClass.templateMethod();
abstractTemplateClass = new ConcreteTemplateClassB();
abstractTemplateClass.templateMethod();
}
}
结果
五、总结
从代码结构和结果就可以看出来,模板模式主要就是定义了算法的步骤,无论你子类如何实现都必须按照我父类定义好的步骤来实现。