1.定义
模版模式(Template Pattern)是一种行为型设计模式,它定义了一个操作中的算法骨架,将操作当中的某些步骤延迟到子类中去实现。模版模式通过在抽象类中定义一个模版方法,该方法包含了算法的主要步骤和执行顺序,而将其中某些具体的步骤留给子类去实现。不同的子类可以根据自身需求,去实现这些步骤,从而制定出符合特定业务逻辑的算法。
2.模版模式的结构
1.抽象类:抽象类中定义了模版方法,该方法包含了算法的基本骨架,也就是一系列固定的顺序步骤。抽象类中还定义了一些抽象方法,这些方法是留给子类去实现的,用于定制算法中的可变部分。除此之外,抽象类中还可以包含一些具体的方法,这些方法为算法提供了通用的视线。
2.具体子类:继承自抽象类,实现抽象类中定义的抽象方法,为模版方法中的可变步骤提供具体的实现。
3.代码示例
1.抽象类,到银行办理业务时,先取号,再排队,再办理业务,这个流程是不可变的,所以使用了final去修饰process方法,这样子类就不能去重写process这个模版方法了。
public abstract class AbstractBank {
//流程(模版方法)
public final void process() {
//1、取号码
this.register();
//2、排队
this.queue();
//3、办理业务
this.transact();
}
//取号码
public int register() {
int register = ((int) (Math.random()*10));
return register;
}
//排队
public void queue() {
System.out.println("queue......");
}
//办理业务
public abstract String transact();
}
2.抽象类的具体实现类,可以有多个
public class Save extends AbstractBank{
@Override
public String transact() {
return "这里写办理存钱业务的业务逻辑";
}
}
public class WithdrawMoney extends AbstractBank{
@Override
public String transact() {
return "这里写办理取钱业务的业务逻辑";
}
}
3.客户端类,创建子类对象,调用父类里面的模版方法。
public class Client {
public static void main(String[] args) {
//办理存款
Save save = new Save();
save.process();
//办理取款
WithdrawMoney withdrawMoney = new WithdrawMoney();
withdrawMoney.process();
}
}
4.使用模版模式的注意事项
模版模式实现了代码复用,父类中的模版方法和已经实现的步骤会被子类继承,后面如果需要修改算法流程,只需要修改父类中的模版方法或者那些已经实现的步骤,子类就会继承这些修改。缺点就是每一个不同的实现都需要新增一个子类,导致类的数量增加。