zoukankan      html  css  js  c++  java
  • 设计模式(10)模板方法模式

    模板方法模式是一种运用十分广泛的设计模式,它定义了一个方法的主体步骤,各个子类可以根据具体业务去自定义的实现各自特殊的步骤。下面是一个简单的例子

    我们定义了一个template的抽象模板类,其中主方法中执行了四个步骤,其中步骤2是各个子类都不同的,也是各个子类都需要实现的方法,所以定义为抽象方法,步骤1、步骤3、步骤4则是根据各个子类的具体业务去选择实现某些方法。

    下面是代码

    public abstract class Template {
    
        public final void mainFunction() {
            this.step1();
            this.step2();
            this.step3();
            this.step4();
        }
    
        protected void step1() {
            System.out.println("执行步骤1");
        }
    
        protected abstract void step2();
    
        protected void step3() {
        }
    
        protected void step4() {
            System.out.println("执行步骤4");
        }
    
        public static Template getTemplateChildren(ChildrenEnum childrenType) throws Exception {
            switch (childrenType) {
                case CHILDREN_ONE:
                    return new TemplateChildren1();
                case CHILDREN_TWO:
                    return new TemplateChildren2();
                default:
                    throw new Exception("未知的子类类型!");
            }
        }
    }
    Template
    public class TemplateChildren1 extends Template {
    
        @Override
        protected void step2() {
            System.out.println("执行子类1的步骤2");
        }
    
        @Override
        protected void step3() {
            System.out.println("执行子类1的步骤3");
        }
    }
    TemplateChildren1
    public class TemplateChildren2 extends Template {
    
        @Override
        protected void step2() {
            System.out.println("执行子类2的步骤2");
        }
    
        @Override
        protected void step4() {
            System.out.println("执行子类2的步骤4");
        }
    }
    TemplateChildren2
    public enum ChildrenEnum {
        CHILDREN_ONE,
    
        CHILDREN_TWO;
    }
    ChildrenEnum

    测试

    public static void main(String[] args) throws Exception {
            Template template1 = Template.getTemplateChildren(ChildrenEnum.CHILDREN_ONE);
            template1.mainFunction();
            System.out.println("---------------------------------------------");
            Template template2 = Template.getTemplateChildren(ChildrenEnum.CHILDREN_TWO);
            template2.mainFunction();
        }

    测试结果

    上述例子中,我们在父类模板中实现了步骤1、步骤4,因为只有部分子类需要做步骤3,所以将在父类中定义了一个空的方法,由需要这一步的子类去实现具体的方法。

    父类中的主方法我们定义为final,是为了防止子类去重写该方法。

    模板方法通常和工厂方法放在一起使用,这样子类的创建会更加简单,本例就是使用了简单工厂+模板方法。

    当我们在做一个业务的时候,如果这个业务的主流程不变,但是根据各个不同的情况,主流程中的某个子步骤处理方式不同,就可以使用模板方法,定义一套主流程模板,具体的步骤根据子类的业务去进行重写。

    使用模板方法的时候需要注意主流程的步骤的抽象,这是很重要的,将主流程抽象出来,变成几个步骤,只要这一步做好,模板方法使用起来就很顺畅了。

  • 相关阅读:
    【leetcode】1215.Stepping Numbers
    【leetcode】1214.Two Sum BSTs
    【leetcode】1213.Intersection of Three Sorted Arrays
    【leetcode】1210. Minimum Moves to Reach Target with Rotations
    【leetcode】1209. Remove All Adjacent Duplicates in String II
    【leetcode】1208. Get Equal Substrings Within Budget
    【leetcode】1207. Unique Number of Occurrences
    【leetcode】689. Maximum Sum of 3 Non-Overlapping Subarrays
    【leetcode】LCP 3. Programmable Robot
    【leetcode】LCP 1. Guess Numbers
  • 原文地址:https://www.cnblogs.com/oeleven/p/10591323.html
Copyright © 2011-2022 走看看