《Java设计模式之模板模式》

《模板模式》

  模板模式:定义一个算法结构,让部分步骤延迟到子类去实现,使得子类不得改变算法结构就可以重定义算法的某些特定本步骤。
  
  模板模式组成:
   抽象父类:实现了一个模板方法,定义了一个算法骨架,部分算法延迟到子类实现
   具体实现类:实现父类中抽象的算法。

  以魔兽世界战士为例, 代码如下:
//抽象父类
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.模板模式采用的继承,所以在编译时就确定了算法的实现,而策略模式使用的组合可以动态的实现算法。

猜你喜欢

转载自blog.csdn.net/eragon444668/article/details/76339403