23种设计模式+额外常用设计模式汇总 (持续更新)

简介

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.
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
-----------------------------------------------------------------深入浅出的设计模式

  • 模板方法模式(Template Method Pattern) 实际上是封装了一个固定流程,该流程由几个步骤组成,具体步骤可以由子类进行不同实现,从而让固定的流程产生不同的结果。

  • 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

  • 模板方法模式实际上是所有模式中最为常见的几个模式之一,而且很多人可能使用过模板方法模式而没有意识到自己已经使用了这个模式。模板方法模式是基于继承的代码复用的基本技术,模板方法模式的结构和用法也是面向对象设计的核心模板方法的本质:抽象封装流程,具体进行实现

  • 模版方法模式需要开发抽象类和具体子类的设计师之间的协作。

    1. 一个设计师负责给出一个算法的轮廓和骨架
    2. 另一些设计师则负责给出这个算法的各个逻辑步骤。
    3. 代表这些具体逻辑步骤的方法称做基本方法(primitive method)
    4. 将这些基本方法总汇起来的方法叫做模版方法(template method),这个设计模式的名字就是从此而来。

主要解决
当完成一个操作具有固定的流程时,由抽象固定流程步骤,具体步骤交给子类进行具体实现(固定的流程,不同的实现)。

优缺点

优点

  • 封装不变,扩展可变:父类封装了具体流程以及实现部分不变行为,其它可变行为交由子类进行具体实现;
  • 流程由父类控制,子类进行实现:框架流程由父类限定,子类无法更改;子类可以针对流程某些步骤进行具体实现;
  • 提取公共代码,便于维护

缺点

  • 抽象规定了行为,具体负责实现,与通常事物的行为相反,会带来理解上的困难(通俗地说,“父类调用了子类方法”);
  • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景

当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同的时候,我们通常要考虑用模板方法模式解决。

  • 多个子类有公有的方法,并且逻辑基本相同时;
  • 重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现;
  • 重构时,模板方法模式 是一个经常使用的模式,把相同的代码抽取到父类,然后通过钩子函数约束其行为;

注意事项: 为防止恶意操作,一般模板方法都加上 final 关键词。

模式讲解

首先来看下 模板方法模式 的通用 UML 类图:

模板方法模式
从 UML 类图中,我们可以看到,模板方法模式 主要包含两种角色:

抽象模板(AbstractClass): 抽象模板类,定义了一套算法框架/流程;
具体实现(ConcreteClass): 具体实现类,对算法框架/流程的某些步骤进行了实现;

当然这只是书面上的定义,用起来你会发现,为什么变得很复杂,好像更难了一样,你也有很多疑问?

  • 在抽象类中只能定义抽象函数吗?
    不是!看使用场景第三条!
  • 每一个抽象子类都要具体实现吗?
    语法上是的,但逻辑上,可以Do nothing
  • 依据第一问,我能否对非抽象方法重写?
    当然,语法上可以,而且逻辑上也可以。

最后,设计模式给出的是一种设计框架,而不是条条框框,你需要用的是他真正优秀的地方!

开发实例

抽象类:

abstract class AbstractClass {protected void Boil_water() {System.out.println("SpecificMethod:烧水,倒一杯热水");/** 模板方法的抽象类中,也是可以定义具体方法的, * 一般子类中都具备或大部分中都具备时,放到抽象父类中。*/}// 需要子类必须实现的需要写成抽象类protected abstract void Abstract_step1();protected abstract void Abstract_step2();protected void Drink() {System.out.println("SpecificMethod:吹一吹再喝,别烫着!");}// 声明为final方法,避免子类覆写public final void After_Tea() {//来一杯下午茶吧this.Boil_water();this.Abstract_step1();this.Abstract_step2();this.Drink();}
}

我要喝咖啡

class Concrete_Cof extends AbstractClass {@Override// 具体实现,重写父类抽象方法protected void Abstract_step1() {System.out.println("把咖啡豆磨好,倒进杯子里");}@Overrideprotected void Abstract_step2() {System.out.println("加入方糖和奶精");}}

我要喝茶

class Concrete_Tea extends AbstractClass {@Overrideprotected void Abstract_step1() {System.out.println("把茶饼分开,放进杯子里");}@Overrideprotected void Abstract_step2() {//Do nothing //可以写成这种什么都没有的,毕竟喝茶我什么都不加(手动狗头)}}

我要喝奶茶


public class Concrete_MilkTea extends AbstractClass {protected void Boil_water() {System.out.println("煮一杯热牛奶");}@Overrideprotected void Abstract_step1() {System.out.println("把茶饼分开,放进杯子里,过滤");}@Overrideprotected void Abstract_step2() {System.out.println("加入方糖和香精");}}
class Client {public static void main(String[] args) {AbstractClass abc = new Concrete_Cof();abc.After_Tea();System.out.println("----------Next day-------------");abc=new Concrete_Tea();abc.After_Tea();System.out.println("----------Next day-------------");abc=new Concrete_MilkTea();abc.After_Tea();}
}

运行结果:

写在最后:
我叫风骨散人,名字的意思是我多想可以不低头的自由生活,可现实却不是这样。家境贫寒,总得向这个世界低头,所以我一直在奋斗,想改变我的命运给亲人好的生活,希望同样被生活绑架的你可以通过自己的努力改变现状,深知成年人的世界里没有容易二字。目前是一名在校大学生,预计考研,热爱编程,热爱技术,喜欢分享,知识无界,希望我的分享可以帮到你!
如果有什么想看的,可以私信我,如果在能力范围内,我会发布相应的博文!
感谢大家的阅读!

『设计模式』设计模式--模板方法模式相关推荐

  1. 咖啡泡JAVA_java《Head First 设计模式》之模板方法模式——冲泡咖啡和茶

    <Head First 设计模式>之模板方法模式--冲泡咖啡和茶 模板方法模式(Template) 在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变 ...

  2. 『设计模式』设计模式--原型模式

    23种设计模式+额外常用设计模式汇总 (持续更新) 1.概念: 原型模式(Prototype Pattern)是通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同 ...

  3. 小话设计模式五:模板方法模式

    模板方法模式定义: 定义一个操作中的算法骨架,而将一些实现步骤延迟到子类当中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 模板方法解析: 模板方法模式是比较简单的一种设计 ...

  4. 设计模式(十):模板方法模式

    目录 1.整体框架 2.介绍 2.1.定义 2.2.作用 2.3.解决的问题 3.认识模版方法模式 3.1.变与不变 3.2.好莱坞法则 3.3.对设计原则的体现 4.模式原理 4.1.UML类图 & ...

  5. Java设计模式系列之——模板方法模式

    大事件 关注篮球或者喜欢逛社交网站的朋友们可能都知道,2019年10月5日,NBA休斯顿火箭队总经理莫雷在推特上发布了一张无知的涉港图片,引发全体中国人民的强烈抗议和不满,一时间舆论哗然,此后,NBA ...

  6. Java设计模式9,模板方法模式

    目录 一.模板方法模式 二.模板方法模式的结构 三.模板方法模式的优缺点 1.优点 2.缺点 四.模板方法模式的使用场景 五.通过模板方法模式实现 抽象类WorkDay 1.顶级抽象类 2.项目经理的 ...

  7. 23种设计模式之:模板方法模式

    转载地址:https://blog.csdn.net/zhengzhb/article/details/7405608 整理的设计模式实例:https://github.com/jinchuanchu ...

  8. 设计模式系列之 模板方法模式

    定义 在模板方法中定义一个算法的骨架,而将部分步骤延迟到子类中,使子类在不改变算法结构的情况下,重新定义算法中的部分步骤. 理解该模式的关键就在"模板"二字.什么是模板?模板就是预 ...

  9. 设计模式读书笔记-----模板方法模式

    首先我们先来看两个例子:冲咖啡和泡茶.冲咖啡和泡茶的基本流程如下: 所以用代码来创建如下: 咖啡:Caffee.java public class Coffee {void prepareRecipe ...

最新文章

  1. 读书笔记|如何让用户为你的产品尖叫
  2. 反弹模型(bounce model)----adot, H, Hdot变化图
  3. 【若依(ruoyi)】datetimepicker日期和时间插件
  4. 添加到package_pycharm里面添加镜像库
  5. [JS-BOM]BOM_Location地址栏对象
  6. mysql 表数据diff,mysqldiff使用笔记
  7. slide简介(大数据技术)
  8. c语言解三元一次方程组_在R里面对三元一次方程求解
  9. scala中实现break与continue功能
  10. 自定义Flash背景的相关设置方法以及其与目录下的文件的对应关系
  11. 【FPGA-ASK调制解调】2-ASK调制和解调的Verilog代码实现
  12. 原生js实现多语言切换
  13. html作品使用说明,使用说明html模板
  14. 正牌韦小宝之奉旨沟女 解说
  15. 我喜欢计算机作文300字,关于我喜欢作文300字
  16. 移动硬盘位置不可用的数据恢复方法
  17. html前端几种加密方式的整理
  18. 半年巨亏10亿,水滴烧钱枯竭硬伤难愈
  19. jsp有哪些动作作用分别是什么?
  20. oracle中使用online,batch(Oracle+shell)及Online(web即Java)使用场景区分(1)

热门文章

  1. endl、flush、ends、unitbuf、nounitbuf区别及详解
  2. Android开发之Mac配置环境变量
  3. 安卓dts音频解码_DTS音效、解码、编码概念剖析
  4. ffmpeg for iOS,并调试iFrameExtractor demo
  5. u3d文件上传至服务器,unity 上传图片到云服务器
  6. oracle rowID切片,Oracle中的rowid
  7. mysql主从架构备份,mysql数据库容灾实时备份主从架构
  8. TFBOYS饭票上线引热议,骗局之外,区块链技术能重构娱乐产业吗?
  9. angular 在IIS部署运行
  10. 浪潮在美发布InCloudRail超融合一体机,助力数据中心平滑上云