zoukankan      html  css  js  c++  java
  • GOF设计模式——Template Method模式

    一、什么是Template Method模式

            顾名思义,Template Method模式就是模板方法模式。所谓的模板,就好比我们练书法一样,刚开始练习的时候,会拿各种各样的字样模板,照着写,练楷书时,就拿楷书模板,练行书时,就用行书模板。过程是固定的,即都是按着模板写,只是具体是楷书,还是行书,视具体情况,具体选择。那么,对应于Template Method模式,又会是怎样的思想呢?

            Template Method模式就是带有模板功能的模式,组成模式的方法都被定义在父类中。在父类中,只能看到这些方法如何被调用,但不知道这些方法具体怎么操作,因为都被定义为abstract。这些抽象方法的具体实现交给子类,如果有很多个实际情况,那就定义多个子类去实现(譬如子类楷书和子类行书),不论子类的具体实现如何,处理流程都会按照父类中所定义的那样去执行
    二、Template Method模式思想


    AbstractClass(抽象类):不仅仅负责实现模板方法,还负责声明在模板方法中所使用到的抽象方法;

    ConcreteClass(具体类):负责实现AbstractClass的抽象方法。

    三、具体例子


            这里有一个用于打印的模板AbstractDisplay抽象类,StringDisplay子类用于打印字符串,CharDisplay子类用于打印字符。AbstractDisplay抽象类定义了open、print和close三个抽象方法,display方法里面已经定义了这些方法的执行流程。

    1、AbstractDisplay类

    package com.cjs.templateMethod;
     
    public abstract class AbstractDisplay {
     
        public abstract void open();
     
        public abstract void print();
     
        public abstract void close();
     
        public final void display() {
            open();
            for (int i = 0; i < 5; i++) {
                print();
            }
            close();
        }
    }

    这里的display方法定义了open、print和close三个抽象方法的执行流程,而且还用了final修饰,说明,display不可被子类重写,这点很重要,也就是所谓的模板。

    2、StringDisplay类

    package com.cjs.templateMethod;
     
    public class StringDisplay extends AbstractDisplay {
        private int width;
        private String string;
     
        public StringDisplay(String string) {
            this.string = string;
            this.width = string.getBytes().length;//获取string字符串的子节长度
        }
     
        @Override
        public void open() {
            printLine();
        }
     
        @Override
        public void print() {
            System.out.println("|" + string + "|");
        }
     
        @Override
        public void close() {
            printLine();
        }
     
        private void printLine() {
            System.out.print("+");
            for (int i = 0; i < width; i++) {
                System.out.print("-");
            }
            System.out.print("+");
            System.out.println();
        }
    }

    3、CharDisplay类

    package com.cjs.templateMethod;
     
    public class CharDisplay extends AbstractDisplay {
        private char ch;
     
        public CharDisplay(char ch) {
            this.ch = ch;
        }
     
        @Override
        public void open() {
            System.out.print("<<");
        }
     
        @Override
        public void print() {
            System.out.print("* "+ch+" *");
        }
     
        @Override
        public void close() {
            System.out.println(">>");
        }
    }

    4、Main启动类:

    package com.cjs.templateMethod;
     
    public class Main {
        public static void main(String[] args) {
            AbstractDisplay charAbstractDisplay = new CharDisplay('S');
            AbstractDisplay stringAbstractDisplay = new StringDisplay("Hello World");
            charAbstractDisplay.display();
            stringAbstractDisplay.display();
        }
    }

    启动main方法,输出下面结果:

     四、Template Method模式的优点

            从AbstractDisplay类的方法定义中,也可以看得出来,核心逻辑算法是不可再次重写的,也就是说,只要在父类的模板方法(display)中编写算法,就无需在每个子类中再次编写算法。假如没有使用Template Method模式设计类,遇到一些相似功能的需求,就会复制黏贴,然后出现很多相似的方法类,如果刚写好的程序没有出现bug,到了某一天突然崩了,那么要对每一个方法类进行修改,工作量特别大。如果使用Template Method模式进行编程,当我们在模板中发现bug,只要稍稍修改一下模板,所以问题都解决了。

  • 相关阅读:
    第二节:Java环境变量配置
    第一节:VS充当IIS的配置步骤(VS2017和VS2019)
    .Net进阶系列(21)-跨域请求
    02-Unity深入浅出(二)
    第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)
    01-Unity深入浅出(一)
    第十二节:SQLServer存储过程详解及EFCore调用
    Android 组件系列-----Activity的传值和回传值
    Access大数据高效分页语句
    C#清除HTML样式
  • 原文地址:https://www.cnblogs.com/SysoCjs/p/10327088.html
Copyright © 2011-2022 走看看