行为型模式-模板方法模式

模板方法模式

模板方法模式是类的行为模式。定义一个操作中的算法框架,将一些步骤延迟到子类中实现。使得子类可以改变一个算法的结构即可重定义该算法的特定步骤。

模板方法需要开发抽象和子类设计师之间的写作,这就相当于一个总设计师负责给出一个算法和逻辑,而其他的设计师则给出这个算法逻辑的具体实现。

 

模板方法模式的角色

  1. 抽象模板(Abstract Template)角色:该角色定义了一个或多个抽样操作,以便子类去实现;这些操作是基本操作,是一个顶级逻辑的组成步骤。还需要定义并实现一个或多个模板方法,这些模板方法一般是具体方法,即一个框架,实现对基本方法的调度,完成固定的逻辑;
  2. 具体模板(Concrete Template)角色:该角色实现抽象模板中定义的一个或多个抽样模板方法,每一个抽象模板角色可以有任意多个具体模板角色与之对应,而每一个具体模板橘色都可以而给出这个抽象方法的不同实现,从而使顶级的实现各不相同。

模板方法模式优点

  1. 封装不变的部分,扩展可变的部分。不变的部分封装到父类总实现,而可变部分则可以通过继承进行扩展;
  2. 提取公共代码,便于维护。将公共部分的代码抽取到父类中,维护时只需要修改父类中的代码;
  3. 行为由父类控制,子类实现。模板方法的基本方法是由子类实现的,因此子类可以通过扩展增加相应的功能,符合开闭原则。

<span style="font-size:18px;">package template;
//抽象模板,抽象账户类
public abstract class Account {

	//账号
	private String accountNumber;
	
	//基本方法,确定账户的类型,留给子类实现
	protected abstract String getAccountType();
	
	//基本方法,确定利息,留给子类实现
	protected abstract double getInterestRate();
	
	//基本方法,根据账户类型和账号确定账户金额
	public double calculate(String accountType,String accountNumber){
		//省去逻辑
		return 32323.2332D;
	}
	
	//模板方法,计算账户利息
	public double interest(){
		String accoutType = getAccountType();
		double interestRate = getInterestRate();
		double amount = calculate(accoutType,accountNumber);
		return amount * interestRate;
	}
}
</span>

<span style="font-size:18px;">package template;

public class DemandAcount extends Account{
	
	@Override
	protected String getAccountType(){
		return "DEMAND";
	}

	@Override
	protected double getInterestRate() {
		// TODO Auto-generated method stub
		return 0.005D;
	}
}
</span>

<span style="font-size:18px;">package template;

//具体模板,定期账户
public class FixedAcount extends Account{
	
	@Override
	protected String getAccountType(){
		return "ONE_YEAR";
	}

	@Override
	protected double getInterestRate() {
		// TODO Auto-generated method stub
		return 0.035D;
	}
}
</span>

<span style="font-size:18px;">package template;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Account account = new DemandAcount();
		System.out.println("活期利息:"+account.interest());
		
		account = new FixedAcount();
		System.out.println("定期利息:"+account.interest());
		
	}

}
</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值