• Template Method 模板设计模式


    什么是模板设计模式

    对于不了解的模板设计模式的来说,可以认为如同古代的造纸术一样,纸所以成型,取决于用了模板的形状,形状又由镂空的木板组成,而你想要造什么纸,又取决于你使用什么材料. 上面提到了两个关键点 <<模板>> <<材料>>

    定义:

    如同我们在父类中定义处理流程的框架,而在子类中实现具体处理的模板称之为template method 模板设计模式

    具体到面向对象

    • <<模板>> 在对象中我们描述为 抽象类: 定义过程pdl
    • <<材料>> 在对象中我们描述为 具体行为的子类:

    UML 代码

    • AbstractDisplay: 定义模板框架,以及具体的过程,此处定义为 打印5吃字符
    • CharDisplay: 子类具体的实现 怎么去打印.
    • StringDisplay: 同上

    这里要说明一下,子类应该与父类进行协作开发,因为子类具体去做什么不能随意去写,应该根据父类具体的处理流程去定义相应的处理过程,当然可以把文档写清楚,

    • AbstractDisplay
    package base.template;
    
    /**
     * @program: DesignPatterns
     * @description: 只实现display方法抽象类
     * @author: Mr.Dai
     * @create: 2018-04-28 16:12
     **/
    public abstract class AbstractDisplay {
    
          public abstract void open();
          public abstract void print();
          public abstract void close();
    
        /**
         * 实现打印5次的方法
         */
        public void  display() {
            open();
            for (int i = 0; i < 5; i++) {
                print();
            }
            close();
        }
    }
    
    
    • CharDisplay
    package base.template;
    
    /**
     * @program: DesignPatterns
     * @description: 实现单个字符的打印
     * @author: Mr.Dai
     * @create: 2018-04-28 16:15
     **/
    public class CharDisplay extends AbstractDisplay {
    
        private Character 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(">>>");
        }
    
        @Override
        public void display() {
            super.display();
        }
    }
    
    • StringDisplay
    package base.template;
    
    /**
     * @program: DesignPatterns
     * @description: 实现对个字符串打印
     * @author: Mr.Dai
     * @create: 2018-04-28 16:18
     **/
    public class StringDisplay extends AbstractDisplay {
        private String string;
        private int width;
    
        public StringDisplay(String string) {
            this.string = string;
            this.width = string.getBytes().length;
        }
    
        @Override
        public void open() {
            printline();
        }
    
        private void printline() {
            System.out.print("+");
            for (int i = 0; i < width; i++) {
                System.out.print("-");
            }
            System.out.println("+");
        }
        @Override
        public void print() {
            System.out.println("|"+string+"|");
        }
    
        @Override
        public void close() {
            printline();
        }
    
        @Override
        public void display() {
            super.display();
        }
    }
    

    转移提高

    • 在java.io.inputstream 使用模板的方法,如下图UML

    • 限于多态的概念,chardisplay stringdisplay 的具体实例都是向上指向的abstractdisplay中的. 无需通过instanceof 制定的具体的子类

    • 由于是通过继承实现 所以遵循的LSP

    • 在子类与父类的协作过程中,必须保证代码量与方法数安排合理, 更多的方法实现放在父类会让子类变得轻松,但是也降低了子类的灵活性.如果父类中实现的方法过少,而且还会导致子类间代码重复出现.

    • 在abstractdisplay 不使用接口而使用抽象类的原因是 需要在定义模板过程的时候 确定相应的算法过程.

    相关设计模式

    • Factory Method: 工厂模式 是将template method 模式用于生成实例的一个典型方法
    • Strategy:策略模式 可以使用委托改变的程序的行为,与template method 模式改变部分行为不同的是,他可以作为替换整个算法.

    需要掌握的职责

    • 子类角度
      • 在子类中可以使用父类定义的方法
      • 可以在子类增加方法实现新的功能
      • 子类重写父类的方法可以改变父类的行为 一般情况下在定义父类模板的时候 确定是否使用final
    • 父类角度
      • 期待子类实现抽象方法.
      • 要求子类去实现抽象方法.
  • 相关阅读:
    MSP430G2553 4x4矩阵键盘
    数论 (1)
    吐血分享一款免费看所有付费影视的app,不好用来石欠我
    Nginx如何部署静态web项目
    SpringBoot-RestTemplate实现调用第三方API
    信息收集小技巧
    kali常用命令
    kali中的Firefox改中文
    反射与注解
    MyBatis-Plus 基本用法
  • 原文地址:https://www.cnblogs.com/dgwblog/p/8968891.html
Copyright © 2020-2023  润新知