模板方法模式

模板方法模式:

在一个方法中,实现一个算法,并推迟定义算法中某些步骤,从而让子类重新定义他们,不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。

模板方法uml图


抽象模板角色:

1、定义一个或多个抽象操作, 以便让子类实现,这些抽象操作叫基本操作,他是一个顶级逻辑的组成步骤。

2、定义并实现了一个模板方法,这个模板方法一般是个具体方法,它给出了一个顶层逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现,顶级逻辑也有可能调用一些具体方法。

具体模板角色:

1、实现父类所定义的一个或多个抽象方法,他们是顶级逻辑的组成步骤

2、每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。

模板方法模式中的方法种类

模板方法模式由一个抽象类和一组实现类通过继承结构组成,抽象类中方法分为三种:

抽象方法:父类中只声明不加以实现,而是定义好规范,由它的子类实现

模板方法(具体方法):由抽象类声明并加以实现,把基本操作方法组合在一起形成一个总算法或一个总行为的方法,一般来说,模板方法调用抽象方法来完成主要的逻辑功能。模板方法大多会定义为final类型,知名主要的逻辑功能不能在子类中重写,子类可置换掉父类的可变部分,但子类却不可以改变模板方法所代表的顶层逻辑,另外,一个抽象类中可以有任意多个模板方法,每个模板方法都可调用任意多个具体方法。

钩子方法:由抽象类声明并加以实现,但是子类可以去扩展,子类可以通过扩展钩子方法来影响模板方法的逻辑,通常抽象类给出的实现是一个空实现,作为方法的默认实现。

模板方法的优点及适用场景

1、容易扩展:一般来说抽象类中的模板方法是不易发生改变的部分,而抽象方法是容易发生变化的部分,因此通过增加实现类一般可以很容易的实现功能的扩展,符合开闭原则

2、便于维护:对于模板方法模式来说,正是因为他们的主要逻辑相同,才使用了模板方法,假如不使用模板方法,任由这些相同的代码散乱地分布在不同的类中,维护起来是非常不便的。

3、比较灵活:因为有钩子方法,因此子类的实现也可影响父类中主逻辑的运行,但在灵活的同时,由于子类影响了父类,违反了里氏替换原则,也会给程序带来风险,这就对抽象类的设计有更高的要求。

4、在多个子类拥有相同的方法,并且这些方法逻辑相同时,可以考虑使用模板方法模式,在程序的主框架相同,细节不同的场合下,也比较适合使用这种模式。

public abstract class Account {
  public final double calculateInterest(){
 double interestRate = doCalculateInterestRate();
 String accoutType = doCalculateAccountType();
 double amount = calculateAmount(accoutType);
 return amount*interestRate;
  }
  
  protected abstract String doCalculateAccountType();
  
  protected abstract double doCalculateInterestRate();
  
  private double calculateAmount(String accputType){
 return 1000;
  }
}


public class CDAccount extends Account{

@Override
protected String doCalculateAccountType() {
return "Certificate of Deposite";
}

@Override
protected double doCalculateInterestRate() {
return 0.06;
}
}


public class MoneyMarketAccount extends Account{

@Override
protected String doCalculateAccountType() {
return "Money Market";
}

@Override
protected double doCalculateInterestRate() {
return 0.05;
}

}


public class Client {
  public static void main(String[] args) {
Account account = new MoneyMarketAccount();
System.out.println("货币市场 利息数额"+account.calculateInterest());
account = new CDAccount();
System.out.println("定期账号利息数额"+account.calculateInterest());
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值