设计模式(九)模板方法模式

      定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以在不改变一个算法的结构即可重新定义该算法的某些特定步骤。

      结构

      模板抽象类:在抽象类中定义了一系列基本操作,这些基本操作可以是具体的,也可以是抽象的。其子类可以重定义或实现这些基本操作。同时,抽象类中实现了一个模板方法,用于定义一个算法的框架。模板方法可以调用抽象类中的基本方法。模板方法模式中的抽象层只能是抽象类,而不能是接口。

      模板具体子类:抽象类的子类,可以覆盖在父类中已经实现的基本操作。

      模板方法:模板方法是定义在抽象类中的,把基本操作方法组合在一起形成的一个总算法。这个模板方法由子类不加以修改地完全继承下来。

      基本方法:是实现算法各个步骤的方法,是模板方法的组成部分。基本方法又可以分成三种:抽象方法、具体方法和钩子方法。

      1、抽象方法:抽象类中声明,子类中实现。

      2、具体方法:由抽象类或者具体类声明和实现,子类可以覆盖也可以直接继承。

      3、钩子方法:由抽象类或者具体类声明和实现,子类可能会加以扩展。钩子方法有两类:1、可以与一些具体步骤挂钩,以实现在不同条件下执行模板方法中的不同步骤,这类钩子方法的返回类型通常是bool类型的。2、实现体为空的具体方法,子类可以根据需要覆盖或者继承这些钩子方法。

      这里举一个这样的场景作为例子,分别导入两个不同格式的excel进行数据库操作,一个是对学生信息的excel模板,一个是包含学生信息和成绩信息的excel模板。

/**
 * 模板抽象类定义
 * @author Jeff Xu
 * @since 2016-12-22
 */
public abstract class AbstractTemplate {
		
	/**
	 * 模板方法,算法架构的顶级定义者
	 */
	public void template(){
		readExls();
		insertStudentInfo();
		if(isNeedSaveScore()){
			insertScoreInfo();
		}
	}

	 /**
	  * 读取Excel(抽象方法)
	  */
	 abstract void readExls();
	 
	 /**
	  * 保存学生数据(抽象方法)
	  */
	 abstract void insertStudentInfo();
	 
	 /**
	  * 是否需要保存成绩信息(钩子方法)
	  * @return
	  */
	 Boolean isNeedSaveScore(){
		 return false;
	 }
	 	 
	 /**
	  * 保存成绩信息(实现体为空的钩子方法)
	  */
	 void insertScoreInfo(){
		 
	 }
	
}
/**
 * 具体模板类定义
 * 
 * @author Jeff Xu
 * @since 2016-12-22
 */
public class StudentTemplate extends AbstractTemplate {

	/**
	 * 读取学生信息的Excel模板
	 */
	public void readExls() {
		System.out.println("读取学生信息的Excel模板");
	}

	/**
	 * 保存学生数据
	 */
	public void insertStudentInfo() {
		System.out.println("保存学生数据");
	}

}
/**
 * 具体模板类定义
 * 
 * @author Jeff Xu
 * @since 2016-12-22
 */
public class StudentScoreTemplate extends AbstractTemplate {

	/**
	 * 读取学生成绩信息的Excel模板
	 */
	public void readExls() {
		System.out.println("读取学生成绩信息的Excel模板");
	}

	/**
	 * 保存学生数据
	 */
	public void insertStudentInfo() {
		System.out.println("保存学生数据");
	}
	
	/**
	  * 是否需要保存成绩信息(钩子方法)
	  * @return
	  */
	public Boolean isNeedSaveScore(){
		 return true;
	 }

	/**
	 * 保存成绩信息
	 */
	public void insertScoreInfo() {
		System.out.println("保存成绩数据");
	}

}
/**
 * 测试类定义
 * @author Jeff Xu
 * @since 2016-12-22
 */
public class ClientTest {
	
	public static void main(String[] agrs){
		AbstractTemplate studentTemplate = new StudentTemplate();
		studentTemplate.template();
		AbstractTemplate studentScoreTemplate = new StudentScoreTemplate();
		studentScoreTemplate.template();
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值