行为型模式(Behavioral Pattern)是对不同的对象之间划分责任和算法的抽象化。行为型模式包括11种模式:模板方法模式、命令模式、责任链模式、策略模式、迭代器模式、中介者模式、观察者模式、备忘录模式、访问者模式、状态模式、解释器模式。

定义

 模板方法模式(Template Method Pattern)是一种简单的、常见的且应用非常广泛的模式。

 模板方法模式的英文原话是:Define the  skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.

 翻译:定义一个操作中的算法框架,将一些步骤延迟到子类中,使得子类可以在不改变算法结构的前提下即可重新定义该算法的某些特定步骤。

角色:

 抽象模板(Abstract Template)角色:该角色定义一个或多个抽象操作,以便让子类实现。这些抽象操作是基本操作,是一个顶级逻辑的组成步骤。还需要定义并实现一个或几个模板方法,这些模板方法一般是具体方法,即一个框架,实现对基本方法的调度,完成固定的逻辑。

 具体模板(Concrete Template)角色:该角色实现抽象模板中定义的一个或多个抽象方法,每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。

/*** 抽象模板角色*/
public abstract class AbstractClass {//基本方法protected abstract void operation();//基本方法2protected abstract void operation2();//模板方法public void templateMethod(){//调用基本方法,完成相关逻辑this.operation();this.operation2();}}/*** 具体模板角色*/
public class ConcreteClass extends AbstractClass{//实现基本业务方法
    @Overrideprotected void operation() {//业务逻辑System.out.println("具体类的操作");}@Overrideprotected void operation2() {//业务逻辑System.out.println("具体类的操作2");}
}public class Client {public static void main(String[] args) {AbstractClass ac = new ConcreteClass();//调用模板方法
        ac.templateMethod();}
}

源码

模板方法调用基本方法后结果如下:

优点

 封装不变的部分,扩展可变的部分。将不变的部分封装到父类中实现,而可变的部分则可以通过继承进行扩展。

 提取公共部分代码,便于维护。将公共部分的代码抽取出来放在父类中,维护时只需修改父类中的代码。

 行为由父类控制,子类实现。模板方法模式中的基本方法是由子类实现的,因此子类可以通过扩展增加相应的功能,符合开闭原则。

应用场景

 多个子类有公共方法,并且逻辑基本相同时。

 可以把重要的、复杂的核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。

 重构时,模板方法模式是一种经常使用的模式,将相同的代码抽取出来放到父类中。

事务就用到了这个设计模式,前置增强,后置增强都延迟到子类中去

计算银行利息Demo

/*** 抽象模板,抽象账户类*/
public abstract class Account {//账号private String accountNumber;//构造函数public Account(){accountNumber = null;}public Account(String accountNumber) {this.accountNumber = accountNumber;}/*** 基本方法,确定账户类型,留给子类实现* @return*/protected abstract String getAccountType();/*** 基本方法,确定利息,留给子类实现* @return*/protected abstract double getInterestRate();/*** 基本方法,根据账户类型和账户确定账户金额* @param accountType* @param accountNumber* @return*/public double calculateAmount(String accountType,String accountNumber){//访问数据库...此处直接返回账户金额return 10000.00D;}//模板方法,计算账户利息public double calculateInterest(){String accountType = getAccountType();double interestRate = getInterestRate();double amount = calculateAmount(accountType,accountNumber);return amount*interestRate;}}/*** 具体模板类,活期账户*/
public class DemandAccount extends Account {@Overrideprotected String getAccountType() {return "活期";}@Overrideprotected double getInterestRate() {return 0.003D;}}/*** 具体模板类,定期账户*/
public class FixedAccount extends Account {/*** 基本方法,确定账户类型* @return*/protected String getAccountType() {return "一年定期";}/*** 基本方法,确定利息* @return*/protected double getInterestRate() {return 0.04D;}
}/*** 测试类*/
public class ClientAccount {public static void main(String[] args) {Account account = new DemandAccount();System.out.println("活期账户利息:"+account.calculateInterest());account = new FixedAccount();System.out.println("一年定期账户利息:"+account.calculateInterest());}
}

源码

运行结果:

转载于:https://www.cnblogs.com/aeolian/p/8872293.html

设计模式-模板方法模式(15)相关推荐

  1. 行为型设计模式---模板方法模式

    设计模式 序号 内容 链接地址 1 设计模式七大原则 https://blog.csdn.net/qq_39668819/article/details/115390615 2 创建型设计模式–工厂模 ...

  2. 在一个程序设计里,不同的功能窗口有着相似的功能实现方式,可采用设计模式---模板方法模式

        前段时间学习了一些设计模式,最近在做项目的过程中恰巧用到了其中的一个--模板方法模式.这个模式在程序设计过程中可是为小编省去了不少的代码量呢.具体是怎样应用的呢?接下来小编为您分享. 前面博文 ...

  3. 『设计模式』瑞幸咖啡还是星巴克,一杯下午茶让我明白 设计模式--模板方法模式(Template Method Pattern)

    23种设计模式+额外常用设计模式汇总 (持续更新) 简介 Define the skeleton of an algorithm in an operation,deferring some step ...

  4. 『设计模式』设计模式--模板方法模式

    23种设计模式+额外常用设计模式汇总 (持续更新) 简介 Define the skeleton of an algorithm in an operation,deferring some step ...

  5. Java设计模式-模板方法模式详解

    Java设计模式-模板方法模式 文章目录 Java设计模式-模板方法模式 0.前言 1.模板方法原理 2.模板方法模式中的角色 3.模板方法模式的UML类图 4.代码实现 5.编码测试 6.模板模式中 ...

  6. Java设计模式 - 模板方法模式

    Java设计模式 - 模板方法模式 定义一个算法的骨架,并将一些步骤通过子类表达. UML图示 要点 1. 定义一个算法的骨架 - 建立一个抽象类 2. 将一些步骤通过子类表达 - 子类继承抽象类 赋 ...

  7. linkin大话设计模式--模板方法模式

    linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...

  8. 15、面向对象语言的23种设计模式-模板方法模式

    一.什么是模板方法模式 就是给固定的流程制定一个模板,然后一步步执行,基本就是对普通方法.抽象方法以及虚方法的实际运用. 二.模板方法模式的作用 模板方法非常强大,框架搭建必备. 模板方法:定义通用处 ...

  9. JAVA 设计模式 模板方法模式

    定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...

最新文章

  1. 软件测试面试的linux基础知识,linux基础面试题
  2. Normal2Height工具已经完成
  3. 特征选择和特征生成问题初探
  4. python之发送HTML内容的邮件
  5. PHP——Array to string conversion 解决方案
  6. 注意扩展方法的返回值类型
  7. HDU 4923 Room and Moor(瞎搞题)
  8. 计算机信息技术基础学的是什么内容,计算机信息技术基础练习题及答案(许骏)...
  9. 浅谈服务器使用RAID5磁盘阵列的问题
  10. python必备入门代码-20行python代码的入门级小游戏的详解
  11. 3.3 自定义控件基础 之 View的绘制
  12. 史上最牛最全android开发知识汇总
  13. 1、曾经风光无限的jsp,为什么现在很少有人使用了?
  14. Iphone 5s/iPad Air/iPad Mini 2 降级10.3.3
  15. xlsxwriter写入Excel
  16. 宝塔linux 解压文件,宝塔面板能否解压缩文件
  17. 住房和城乡建设部关于2022年第十批一级建造师注册人员名单的公告
  18. 面试官问你什么是QPS?
  19. python xlrd模块 xlwd模块 python操作Excel python读取Excel
  20. 给测试实习生,新人的小小建议

热门文章

  1. RabbitMQ、Redis
  2. ORACLE数据库维护
  3. WCF的追踪分析工具——SvcPerf
  4. CString 是一种很有用的数据类型
  5. 关于SQL数据库中的数据到如何导出--SQL2000导入到SQL2008中
  6. 设置、获得对话框中 编辑框控件 EDIT 的内容
  7. Netty工作笔记0036---单Reactor单线程模式
  8. STM32工作笔记004---了解高速版PCB设计Cadence
  9. VB.NET工作笔记008---vs2017创建使用WCF服务_并调用服务demo
  10. SpringCloud工作笔记046---PostMan打不开怎么解决