《模板模式》
模板模式:定义一个算法结构,让部分步骤延迟到子类去实现,使得子类不得改变算法结构就可以重定义算法的某些特定本步骤。
模板模式组成:
抽象父类:实现了一个模板方法,定义了一个算法骨架,部分算法延迟到子类实现
具体实现类:实现父类中抽象的算法。
以魔兽世界战士为例, 代码如下:
//抽象父类
public abstract class Warrior {
//定义的算法步骤,不能被子类覆盖
public final void attack(){
//父类中已经实现不可覆盖的方法
takeOutWeapon();
//需要子类实现的两个抽象方法
attack1();
attack2();
//子类可选择实现的空方法
attack3();
}
public final void takeOutWeapon(){
System.out.println("掏出武器");
}
public void attack3(){}
public abstract void attack1();
public abstract void attack2();
}
//具体实现子类
public class NoobWarrior extends Warrior {
@Override
public void attack1() {
System.out.println("普通攻击");
}
@Override
public void attack2() {
System.out.println("英勇打击");
}
}
public class NbWarrior extends Warrior {
@Override
public void attack1() {
System.out.println("巨龙打击");
}
@Override
public void attack2() {
System.out.println("致死打击");
}
@Override
public void attack3() {
System.out.println("斩杀");
}
}
//测试
public class TemplateTest {
@Test
public void testTemplate(){
Warrior w1 = new NbWarrior();
w1.attack();
Warrior w2 = new NoobWarrior();
w2.attack();
}
}
我们发现上述示例抽象父类中有一个空方法attack3(),它可以被称为“钩子”,即子类可以选择是否覆盖该方法,更方便我们进行扩展。
总结
优点:
1.将不变的行为提取到了父类,去除了子类中的重复代码
2.拓展新的算法时,只需要再创建一个新的子类即可,更易于扩展
模板模式和策略模式的区别:
1.模板模式使用的继承,而策略模式使用的组合
2.模板模式中子类只实现部分变化的算法,所有不会有重复的代码,而策略模式而是通过组合实现所有的算法
3.模板模式采用的继承,所以在编译时就确定了算法的实现,而策略模式使用的组合可以动态的实现算法。