23种设计模式----------模版方法模式
模板方法模式:
模板方法模式,就是定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构可重新定义该算法的某些特定步骤。
简而言之,就是定义一个抽象类,在该抽象类中,有一些需要子类特定实现的方法,和一个基本已经实现不改变的方法,而在这个固定的方法中调用那些需要子类实现的方法,从而达到一些步骤延迟到子类中。
所以,在模板方法模式中一般有两类方法:
1,基本方法。
该方法是由子类实现的,并且在模板方法被调用。
2,模板方法。
一般是一个具体的方法,实现对基本方法的调度,完成固定的逻辑。
例如,一个班级在一个晚会上,每个人都要进行表演唱歌和跳舞,这两项节目。
体现在代码如下:
1 //抽象模板类 2 public abstract class StudentShow { 3 4 //基本方法1 5 public abstract void sing(); 6 //基本方法2 7 public abstract void dance(); 8 //模板方法,对基本方法调用 9 public void show(){ 10 this.sing(); 11 this.dance(); 12 } 13 } 14 //具体实现子类 15 public class JackShow extends StudentShow { 16 17 public void sing() { 18 System.out.println("Jack 唱歌!!!"); 19 } 20 public void dance() { 21 System.out.println("Jack 跳舞!!!"); 22 } 23 } 24 public class RoseShow extends StudentShow { 25 26 public void sing() { 27 System.out.println("Rose 唱歌!!!"); 28 } 29 public void dance() { 30 System.out.println("Rose 跳舞!!!"); 31 } 32 }
具体场景类:
1 public class Client { 2 public static void main(String[] args) { 3 StudentShow jack = new JackShow(); 4 StudentShow rose = new RoseShow(); 5 6 jack.show(); 7 rose.show(); 8 } 9 }
这就是模板方法模式,还是比较简单的。
但是,若是Jack只会唱歌不会跳舞,死活都不跳舞,只进行唱歌表演呢,那怎么办呢。
1 //带控制模板方法的抽象模板类 2 public abstract class StudentShow { 3 4 //基本方法1 5 public abstract void sing(); 6 //基本方法2 7 public abstract void dance(); 8 9 //条件选择判断 10 public boolean isDance(){ 11 return true; 12 } 13 14 //模板方法,对基本方法调用 15 public void show(){ 16 this.sing(); 17 if(isDance()){ 18 this.dance(); 19 } 20 } 21 } 22 //具体实现类1 23 public class JackShow extends StudentShow { 24 25 public void dance() { 26 System.out.println("Jack !!!"); 27 } 28 public void sing() { 29 System.out.println("Jack 跳舞!!!"); 30 } 31 //由于Jack不跳舞,所以重写模板类中控制条件的方法。修改返回值为false 32 public boolean isDance(){ 33 return false; 34 } 35 } 36 //具体实现类2 37 //业务没有修改的子类则无需改动,大大增加了扩展性。 38 public class RoseShow extends StudentShow { 39 40 public void dance() { 41 System.out.println("Rose 跳舞!!!"); 42 } 43 public void sing() { 44 System.out.println("Rose 唱歌!!!"); 45 } 46 } 47 //具体场景类也不需改动 48 public class Client { 49 public static void main(String[] args) { 50 StudentShow jack = new JackShow(); 51 StudentShow rose = new RoseShow(); 52 53 jack.show(); 54 rose.show(); 55 } 56 }
所以,我们可以通过一些条件来控制模板方法中,调用基本方法的顺序,从而达到不同的业务要求。