• Java设计模式--模板设计模式


    一、模版设计模式概述

    在阎宏博士的《JAVA与模式》一书中开头是这样描述模板方法(Template Method)模式的:

      模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

    通俗的理解:模版方法模式就是定义一个算法的骨架,而将具体的算法延迟到子类中来实现

    模板设计模式包含两个部分:

    1. 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
    2. 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。

    二、案例如下:

    需求:计算一个任务执行所需的时间。如:拷贝视频,循环输出

    步骤A:先定义抽象类,将统一的部分抽象出来,形成骨架

    public abstract class TemplateDesign {
    	public long calculateTime(){
    		long start = System.currentTimeMillis();
    		
    		code();
    		
    		long end = System.currentTimeMillis();
    		return end-start;
    	}
    	
        /**
    	 * 此抽象方法由子类实现具体的需求代码
    	 */
    	public abstract void code();
    }
    

    步骤B:定义具体类,继承抽象类,实现具体的需求代码

    比如:此处我们做的是拷贝视频

    public class TemplateDesignDemo01 extends TemplateDesign{
    
    	@Override
    	public void code() {
    		try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream("F:/theBigBang Theory/S01E01.mkv"));
    			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("F:/theBigBang Theory/S01E01-copy.mkv"))) 
    		{
    			byte[] flush = new byte[1024*2];
    			int len=0;
    			while((len=bis.read(flush)) != -1) {
    				bos.write(flush);
    			}
    			bos.flush();
    		}catch(FileNotFoundException e) {
    			e.printStackTrace();
    		}catch(IOException e) {
    			e.printStackTrace();
    		}
    	}
    

    在main中测试

    public class Test {
    	public static void main(String[] args) {
    		TemplateDesign td = new TemplateDesignDemo();
    		System.out.println(td.calculateTime()+"毫秒");;
    	}
    }
    

    测试结果如下:

    又如,当我们需要修改需求时,如:测试一个简单的循环所需要的时间,则只需要修改子类中的代码即可,非常的灵活方便。

    public class TemplateDesignDemo02 extends TemplateDesign{
    
    	@Override
    	public void code() {
    		for(int i=0; i<10000; i++) {
    			System.out.println(i);
    		}
    	}
    }
    

    三、模板设计模式的优缺点:

    优点

    1. 使用模版方法模式,在定义算法骨架的同时,可以很灵活的实现具体的算法,满足用户灵活多变的需求
    2. 通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

    缺点

    1. 如果算法骨架有修改的话,则需要修改抽象类
    2. 每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

    Java新手,若有错误,欢迎指正!

  • 相关阅读:
    mysql 组合聚集函数
    mysql distinct()函数 去重
    mysql sum()函数 , 计算总和
    mysql max()函数,min()函数,获取最大值以及最小值
    mysql count() 函数,对结果统计计数
    三个实例演示 Java Thread Dump 日志分析
    借助LVS+Keepalived实现负载均衡
    配置Tomcat成为系统服务
    快速理解Docker
    tomcat 启动时设置 java 参数,mark
  • 原文地址:https://www.cnblogs.com/Java-biao/p/12588933.html
Copyright © 2020-2023  润新知