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

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

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

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

  • 相关阅读:
    传奇检测命令大全(常用命令)
    传奇版本中利用NPC迅速给人物加血脚本制作
    传奇泡点地图制作脚本
    双击包裹物品自动解包设置方法_传奇版本技术
    传奇地图事件触发脚本
    单机架设传奇服务器第47课:定时器OnTimer功能详解
    单机架设传奇服务器:机器人运行脚本文件
    检测某个地图某个怪物的数量的脚本
    检测当前人物是否在安全区脚本命令
    假人配置说明
  • 原文地址:https://www.cnblogs.com/oeleven/p/10591323.html
Copyright © 2011-2022 走看看