第二十一讲:模板方法模式
AbstractClass的method1()和method2()相当于MakeCar的makeHead()、makeBody()以及makeTail().
存在多个具有相同操作步骤的业务场景,MakeBus和MakeJeep都是这样的业务场景.
模板方法主要是步骤,抽象方法关注的是细节.而细节是由抽象类的子类来实现的.放在实际情况来说,组装车的步骤/顺序是放在模板方法里面,组装车的细节交给子类实现的.
模板方法的实际应用场景是:有一个算法,它有很多步骤,每个算法它有不同的实现细节,
AbstractClass把步骤给抽象出来了,在模板方法templateMethod()里面把步骤规定好.通过不同子类对具体的这些步骤来进行一个不同的实现,
其实模板方法模式是一个很简单的模式,主要是通过子类继承来改变整个算法的行为.
大话设计模式那里描述模板方法模式非常形象.它里面举了一个答试卷的例子.算法步骤体现在答题的顺序.问题是重复的.问题抽象到父类里面.子类给出不同的答案.
不同的实现细节体现在一个问题有不同的答案.A和B两个卷子它都有自己不同的实现.回答问题的步骤体现在模板方法里面,答案的不同体现在实现.
抽象是提取共同点.如果子类的实现操作的步骤和父类不一样那就格格不入了.
核心和重点是应用场景,应用场景三个条件必须记住:步骤体现在模板方法templateMethod()里面,不同的操作细节是体现在父类/抽象类的抽象方法和子类的不同的实现.多个应用场景是MakeBus和MakeJeep和MakeKa.
public class MainClass { public static void main(String[] args) { MakeCar bus = new MakeBus(); /* bus.makeHead(); bus.makeBody(); bus.makeTail();*/ bus.make(); System.out.println("-------------------------------"); MakeCar jeep = new MakeJeep(); /* jeep.makeHead(); jeep.makeBody(); jeep.makeTail();*/ jeep.make(); System.out.println("--------------------------------------"); MakeCar ka = new MakeKa(); ka.make(); } }
public class MakeBus extends MakeCar{ @Override public void makeHead() { // TODO Auto-generated method stub System.out.println("bus:组装车头"); } @Override public void makeBody() { // TODO Auto-generated method stub System.out.println("bus:组装车身"); } @Override public void makeTail() { // TODO Auto-generated method stub System.out.println("bus:组装车尾"); } }
/* * 组装车 组装的可能是不同的车:小轿车、吉普车、巴士 */ public abstract class MakeCar { //组装车头 public abstract void makeHead(); //组装车身 public abstract void makeBody(); //组装车尾 public abstract void makeTail(); //模板方法templateMethod()不是抽象方法,是一个实际的方法,是拟这些方法执行的步骤 //模板方法templateMethod()里面没有实现,它只是调用method1()和method2()这些方法. public void make(){ this.makeHead(); this.makeBody(); this.makeTail(); } }
public class MakeJeep extends MakeCar{ @Override public void makeHead() { // TODO Auto-generated method stub System.out.println("jeep:组装车头"); } @Override public void makeBody() { // TODO Auto-generated method stub System.out.println("jeep:组装车身"); } @Override public void makeTail() { // TODO Auto-generated method stub System.out.println("jeep:组装车尾"); } }
public class MakeKa extends MakeCar{ @Override public void makeHead() { // TODO Auto-generated method stub System.out.println("Ka:组装车头"); } @Override public void makeBody() { // TODO Auto-generated method stub System.out.println("Ka:组装车身"); } @Override public void makeTail() { // TODO Auto-generated method stub System.out.println("Ka:组装车尾"); } }