设计模式(Java随笔)—模板方法模式

模板方法模式(Template Method Pattern):是一种应用非常广泛的模式,去除子类中重复的代码,把不变的行为搬到超类去,更好的实现代码的复用

模板方法模式的角色:

  • 抽象模板(Abstract Template)角色:定义一个或多个抽象操作,让子类去实现这些抽象操作(这叫基本操作),还需定义一个或多个模板方法,这些模板方法是具体的框架,实现对抽象方法的调度,完成固定的逻辑,让子类的任务只是去实现抽象方法。
  • 具体模板(Concrete Template)角色:实现抽象模板中定义的所有抽象方法,可以有多个不同的具体模板角色,每一个具体模板角色都是不同的实现,由此实现模板功能的扩展

这个模式很常用,也很简单,直接代码吧,TALK IS CHEAP,SHOW ME THE CODE.

基础代码实现:

public class TemplateModel {
	/*
	 * 模板方法模式
	 */
	public static void main(String[] args) {
		Template template=new ConcreteTemp();
		template.run();
	}
}

//抽象模板角色
abstract class Template{
	//基本方法—子类实现
	protected abstract void operation();
	//模板方法
	public void run() {
		//调用基本方法,完成相关逻辑
		operation();
	}
}

//具体模板角色
class ConcreteTemp extends Template{
	@Override
	protected void operation() {
			System.out.println("具体模板具体实现");
	}
}

运行结果:
 

具体模板具体实现

模板方法模式实现银行活期和定期账户的利息:

——利息的计算涉及两个步骤:一是确定账户类型(是活期账户还是定期账户);二是确定利息的百分比,这两个方法应抽象到具体模板类中,由具体子类来实现账户类型和利息百分比的输入

import java.math.BigDecimal;
//导包是为了指定输出的数据保留小数位
public class TemplateModel {
	/*
	 * 模板方法模式
	 */
	public static void main(String[] args) {
		Account account;
		double act;
		//保留小数
		BigDecimal bd;
		int d=3;//保留小数位数
		//活期利息
		account=new ConcreteAccountA();
		act=account.getAccount();
		bd= new BigDecimal(act);
		bd=bd.setScale(d,BigDecimal.ROUND_HALF_UP);
		System.out.println("活期利息:"+bd);
		//定期利息
		account=new ConcreteAccountB();
		act=account.getAccount();
		bd= new BigDecimal(act);
		bd=bd.setScale(d,BigDecimal.ROUND_HALF_UP);
		System.out.println("定期利息:"+bd);
		
	}
}

//模板方法模式实现银行定期和活期账户的利息
//抽象账户类
abstract class Account{
	//基本方法
	protected abstract String getAccountNumber();
	protected abstract String getAccountType();
	protected abstract double getInterestRate();
	//根据用户账号和类型从数据库中获取用户金额
	private double getAccountBySQL(String accountNumber,String accountType) {
		//数据库返回金额
		return 5100.00;
	}
	//模板方法
	public double getAccount() {
		String accountNumber= getAccountNumber();
		String accountType= getAccountType();
		double interestRate=getInterestRate();
		double account=getAccountBySQL(accountNumber,accountType);
		return account*interestRate;
	}
}

//具体模板类
//活期
class ConcreteAccountA extends Account{
	//用户账号
	@Override
	protected String getAccountNumber() {
		return null;
	}
	//账号类型
	@Override
	protected String getAccountType() {
		return "活期";
	}
	//利息百分率
	@Override
	protected double getInterestRate() {
		return 0.0047;
	}
}
//定期
class ConcreteAccountB extends Account{
	//用户账号
	@Override
	protected String getAccountNumber() {
		return null;
	}
	//账号类型
	@Override
	protected String getAccountType() {
		return "定期";
	}
	//利息百分率
	@Override
	protected double getInterestRate() {
		return 0.0332;
	}
}

运行结果:

活期利息:23.970
定期利息:169.320

参考书籍:

《大话设计模式》——程杰

《设计模式(Java版)》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值