• 设计模式之——Template模板模式


    Template模式又叫模板模式,是在父类中定义处理流程的框架,在子类中实现具体处理逻辑的模式。当父类的模板方法被调用时程序行为也会不同,但是,不论子类的具体实现如何,处理的流程都会按照父类中所定义的那样进行。

    示例程序:

    将一段字符串和字符循环显示五次的程序:

    • AbstractDisplay 父类抽象的模板,里面定义了处理流程,但是没有具体把实现写出来
    package site.wangxin520.gof.template;
    
    /**
     * 模板模式的模板,使用的是抽象类和抽象方法。
     * 在此模板中,定义一个模板的实现,以及需要子类去实现的抽象方法。
     * 当子类实现抽象方法之后,便可以在本模板中固定的代码逻辑里面调用
     * @author wangXgnaw
     *
     */
    public abstract class AbstractDisplay {
    
        /**
         * 定义一些抽象方法,具体实现等子类进行
         */
        protected abstract void open();
        protected abstract void print();
        protected abstract void close();
        
        /**
         * 定义模板执行的代码逻辑
         * 将字符串和字符循环显示5次
         */
        public final void display(){
            open();
            for (int i = 0; i < 5; i++) {
                print();
            }
            close();
        }
    }
    • CharDisplay 子类实现了父类模板的抽象方法,处理字符
    package site.wangxin520.gof.template;
    
    /**
     * 字符显示操作的子类,继承模板
     * @author wangXgnaw
     *
     */
    public class CharDisplay extends AbstractDisplay{
    
        private Character ch;
        /**
         * 构造函数
         * @param ch 传入字符参数
         */
        public CharDisplay(Character ch) {
            this.ch=ch;
        }
        
        /*
         * 后面就是重写父类模板定义的抽象方法
         * @see site.wangxin520.gof.template.AbstractDisplay#open()
         */
        @Override
        protected void open() {
            System.out.print("(");
        }
    
        @Override
        protected void print() {
            System.out.print(ch);
        }
    
        @Override
        protected void close() {
            System.out.println(")");
        }
    
    }
    • StringDisplay 子类实现了父类的模板抽象方法,处理字符串
    package site.wangxin520.gof.template;
    
    /**
     * 字符串显示操作的模板子类,继承自模板
     * @author wangXgnaw
     *
     */
    public class StringDisplay extends AbstractDisplay{
    
        private String string;
        
        /**
         * 构造函数,传入一个字符串
         * @param string
         */
        public StringDisplay(String string) {
            this.string=string;
        }
        
        /**
         * 后面就是重写父类的抽象方法
         */
        @Override
        protected void open() {
            System.out.println("+------------------------+");
        }
    
        @Override
        protected void print() {
            System.out.println(string);
        }
    
        @Override
        protected void close() {
            System.out.println("+------------------------+");
        }
    
    }
    • TemplateTest 模板模式的测试类
    package site.wangxin520.gof.template;
    
    /**
     * 模板模式的测试类
     * @author wangXgnaw
     *
     */
    public class TemplateTest {
        public static void main(String[] args) {
            AbstractDisplay ad1=new CharDisplay('w');
            ad1.display();
            AbstractDisplay ad2=new StringDisplay("wangxin");
            ad2.display();
        }
    }
    • 控制台显示:

    image

  • 相关阅读:
    05.scrapy框架的UA池和代理池
    04scrapy框架的日志等级和请求传参
    03.scrapy框架之递归解析和post请求
    02.scrapy框架持久化存储
    git
    01.scrapy框架简介和基础应用
    将配置文件由Dos存为unix格式
    利用alias命令别名对常用运维命令的调用 (给命令起别名)
    使用LVM方式扩容硬盘空间
    Vi编辑器添加删除多行注释
  • 原文地址:https://www.cnblogs.com/wangxinblog/p/7599843.html
Copyright © 2020-2023  润新知