第二十一讲:模板方法模式_ide

第二十一讲:模板方法模式_应用场景_02

第二十一讲:模板方法模式_应用场景_03

第二十一讲:模板方法模式_模板方法_04

第二十一讲:模板方法模式_子类_05

AbstractClass的method1()和method2()相当于MakeCar的makeHead()、makeBody()以及makeTail().

第二十一讲:模板方法模式_父类_06

第二十一讲:模板方法模式_子类_07

第二十一讲:模板方法模式_模板方法_08

存在多个具有相同操作步骤的业务场景,MakeBus和MakeJeep都是这样的业务场景.

模板方法主要是步骤,抽象方法关注的是细节.而细节是由抽象类的子类来实现的.放在实际情况来说,组装车的步骤/顺序是放在模板方法里面,组装车的细节交给子类实现的.

模板方法的实际应用场景是:有一个算法,它有很多步骤,每个算法它有不同的实现细节,

AbstractClass把步骤给抽象出来了,在模板方法templateMethod()里面把步骤规定好.通过不同子类对具体的这些步骤来进行一个不同的实现,


 第二十一讲:模板方法模式_父类_09

其实模板方法模式是一个很简单的模式,主要是通过子类继承来改变整个算法的行为.


大话设计模式那里描述模板方法模式非常形象.它里面举了一个答试卷的例子.算法步骤体现在答题的顺序.问题是重复的.问题抽象到父类里面.子类给出不同的答案.

不同的实现细节体现在一个问题有不同的答案.A和B两个卷子它都有自己不同的实现.回答问题的步骤体现在模板方法里面,答案的不同体现在实现.

第二十一讲:模板方法模式_模板方法_10


抽象是提取共同点.如果子类的实现操作的步骤和父类不一样那就格格不入了.


核心和重点是应用场景,应用场景三个条件必须记住:步骤体现在模板方法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:组装车尾");
    }
    
}