Java设计模式之模板(template)方法模式

一,概述

这是写的第二篇Java设计模式的解析了,不过与其说是解析,不如说是自己写的一个Demo,一篇个人笔记。

二,对模板方法模式的一些个人理解

模板方法模式是结构最简单的行为型模式,有时,我们完成一件事情时次序是固定的,只有有些步骤确实变化的。比如,当我们去银行办业务时,就是a排队取号 b办具体业务(取钱) c对工作人员评价 三个步骤,而第二个步骤是不固定的。这种情况下,使用模板方法设计模式就优势明显了。我们只要在抽象方法中定义好完成这么一件事情的骨架,将具体步骤自己实现,而将不固定的部分暴露给子类实现即可,也就是将一些步骤延迟到子类中实现。子类不能改变父类的算法结构,只能是重新定义父类的某些步骤。贴代码吧,直观一点:

 

package com.bighuan.template;

/**
 * 设计模式之模板方法模式Demo
 * 
 * @author bighuan 去银行办理业务的步骤 1,排队取号 2,办理业务 3,为工作人员评分
 */
public abstract class BankTemplate {
	/**
	 * 排队取号
	 */
	public final void getNum() {
		System.out.println("排队取号");
	}

	/**
	 * 办理具体业务定义为抽象方法,供子类实现
	 */
	public abstract void exeTask();

	/**
	 * 评价
	 */
	public final void evaluate() {
		System.out.println("为工作人员评价打分");
	}

	/**
	 * 去银行办理业务所有步骤,整套流程
	 */
	public final void process() {
		getNum();

		exeTask();

		evaluate();

	}
}

在去银行办理业务的抽象模板类中,我们将排队取号和评价等具体方法实现,而将办理业务的核心流程定义为一个抽象的方法exeTask()方法。当子类继承BankTemplate是就必须实现这个方法了,我们就可以在这个方法中做一些取钱啊存款啊等操作。给个例子呗!好的,虽然自己卡里没什么钱,写个取钱的方法还是可以的。如下:

 

 

package com.bighuan.template;

import org.junit.Test;

public class WithdrawMoney extends BankTemplate {

	@Override
	public void exeTask() {
		System.out.println("我来银行取钱");
	}

	@Test
	public void test() {
		process();
	}

}

 

WithdrawMoney继承BankTemplate抽象类,就必须实现父类的抽象方法,在这里就可以实现办具体的业务了。你可以取钱,也可以存钱,等等。并且办一个业务中的流程是不变的,我们在父类的process()中定义好了。不知道你注意到了没有,父类中那些具体的步骤都用final关键字修饰了,不允许子类重写,子类只能自己实现那个暴露的方法,当然了,子类也是可以扩展一些方法的。由此可见,模板方法模式体现了Java中的”开闭原则”。

运行那个test()方法,结果如下:

 

排队取号
我来银行取钱
为工作人员评价打分

 

三,优缺点

优点:1,在父类中将总的具体步骤定义好,由子类实现细节。子类不会更改父类的算法结构。2,实现代码复用。3,很好的体现了开闭原则。

缺点:不同的实现都需要定义一个子类,如果实现过多,系统会过于庞大的,设计会过于复杂。但也体现了“单一职责原则”。

四,总结

少年,记住,今天是Java23种设计模式中的第二种设计模式,努力吧,将那些常用的设计模式掌握。好了,拜拜!

 

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值