模版设计模式是一种行为设计模式,它在父类中定义了基本的算法骨架,而实际的操作步骤延迟到子类去实现。
模版方法设计模式有以下的好处
- 它可以提高代码的复用率,重复或者相近的处理逻辑放在父类中,避免了重复的代码。
- 它可以提高代码的扩展性,将不同的处理逻辑或者特殊逻辑放到子类中,通过对子类的扩展增加新的行为.
举个简单的例子
比如去学校这个动作,我们可以抽象成三个步骤:穿衣服(dressUp),吃早饭(eatBreakfast),带上东西(takeThings):
// 抽象类,定义了模板方法和基本方法
public abstract class AbstractStudent {
// 模板方法,定义了准备去学校的流程
public final void prepareGotoSchool() {
dressUp();
eatBreakfast();
takeThings();
}
// 基本方法,由子类实现
protected abstract void dressUp();
protected abstract void eatBreakfast();
protected abstract void takeThings();
}
// 具体子类,实现了基本方法
public class StudentA extends AbstractStudent {
@Override
protected void dressUp() {
System.out.println("StudentA 穿校服");
}
@Override
protected void eatBreakfast() {
System.out.println("StudentA 吃面包和牛奶");
}
@Override
protected void takeThings() {
System.out.println("StudentA 带上书包和钥匙");
}
}
public class StudentB extends AbstractStudent {
@Override
protected void dressUp() {
System.out.println("StudentB 穿运动服");
}
@Override
protected void eatBreakfast() {
System.out.println("StudentB 吃饺子和豆浆");
}
@Override
protected void takeThings() {
System.out.println("StudentB 带上篮球和手机");
}
}
// 测试类,创建不同的子类对象,调用模板方法
public class Test {
public static void main(String[] args) {
AbstractStudent studentA = new StudentA();
studentA.prepareGotoSchool();
System.out.println("--------------------");
AbstractStudent studentB = new StudentB();
studentB.prepareGotoSchool();
}
}
这个例子比较简单,其实你还可以定义一个钩子,来让子类选择每个动作是否需要执行。
模版模式和策略模式的区别
- 在实现方式上模版模式一般是通过抽象方法和实现类来实现,策略模式是通过接口和实现类来处理;
- 模版方法在抽象类中定义了一个相对固定的算法,算发的步骤具体实现延迟到了子类去完成.而策略模式是定义了一组算法,并将每个算法封装成了一个对象.从而让他们可以相互替换;
- 模版方法更强调的是流程和结构,而策略模式更强调的是灵活性和替换性;