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


    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:组装车尾");
        }
        
    }
  • 相关阅读:
    十天冲刺之三
    设计模式-模板方法模式
    设计模式-观察者模式
    设计模式-迭代子模式
    设计模式-责任链模式
    设计模式-门面模式
    1395. Count Number of Teams
    747. Largest Number At Least Twice of Others
    1160. Find Words That Can Be Formed by Characters
    1539. Kth Missing Positive Number
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6760081.html
Copyright © 2020-2023  润新知