一.简介
我们往往遇见一些问题我们知道它的解决流程,或者说是大概的思路,但是我们不知道它的具体的实现.就像我们的tomcat针对发起的http请求,它知道请求的流程,但是不知道具体逻辑和返回数据,这样我们继承了它的httpservlet类,实现它们的doget方法和dopost方法.实现我们需要实现的具体细节.
二.结构
- 抽象模版类:定义一个或者多个抽象方法,这些方法称为基本操作,在定义一个具体方法,这个具体方法通过调用基本方法来确定顶层逻辑;这个具体操作称为模版方法;
- 具体类:实现抽象模版所定义的抽象操作.
- 类图
代码
//outputpackage templetemethod; /** * Created by ZouHaiBo on 2018/1/20. */ /** * Created by 10250 on 2018/1/19. */ // 贷款 抽象类 abstract class TempleteLoans { // 定义模版方法 怎么贷款 public final void loans() { before(); countInterest(); coutMouth(); } // 计算时间 protected abstract void coutMouth(); // 计算利息 protected abstract void countInterest(); // 钩子方法 protected abstract void before(); } // 平安银行 class PingAnBank extends TempleteLoans { @Override protected void coutMouth() { System.out.println("平安银行计算 时间"); } @Override protected void countInterest() { System.out.println("平安银行计算 利息"); } @Override protected void before() { System.out.println("平安银行欢迎你"); } } // 平安银行 class ZhaoshangBank extends TempleteLoans { @Override protected void coutMouth() { System.out.println("招商银行计算 时间"); } @Override protected void countInterest() { System.out.println("招商银行计算 利息"); } @Override protected void before() { System.out.println("招商银行欢迎您"); } } public class Client { public static void main(String[] args) { // 平安银行 PingAnBank pingAnBank = new PingAnBank(); pingAnBank.loans(); // 招商银行 ZhaoshangBank zhaoshangBank = new ZhaoshangBank(); zhaoshangBank.loans(); } }
//平安银行欢迎你 //平安银行计算 利息 //平安银行计算 时间 //招商银行欢迎您 //招商银行计算 利息 //招商银行计算 时间
三.缺点
- 概念复杂性:从面向对象的本质来讲,父类负责抽象,子类负责具体实现,但是模版方法父类视线了大部分的逻辑,子类只是视线了少量的步骤,而且提供给父类调用.违反了面向对象的一般性抽象思维的原因是它的设计初衷是最大限度的重用;
- 实现复杂性:这种重用方式的代价就是每个子类都背负父类的给它的包袱.
- 父类如果有带参构造,子类必须要去实现;
- 子类在构造器里要注意使用父类成员变量的顺序.
- 子类的编写者必须了解父类的实现
- 父类的改动很容易波及到子类
四.遵守的原则
开闭原则
五.参考文献
大话设计模式