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,是为了防止子类去重写该方法。

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

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

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

  • 相关阅读:
    三层架构和MVC模型的常识
    iOS开发之Auto Layout入门
    js-innerHTML
    $(document).ready() 与window.onload的差别
    java jsp+servlet+mysql实现登录网页设计
    ASCII码表
    表单的提交onsubmit事件
    谋哥:社交小游戏App将是下一个金矿!
    各种表
    vue elementui table 双击单元格实现编辑,聚焦,失去焦点,显示隐藏input和span
  • 原文地址:https://www.cnblogs.com/oeleven/p/10591323.html
Copyright © 2011-2022 走看看