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();}
}

运行结果:


码字这么卖力,麻烦点个赞,点个关注,谢谢。

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

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

  1. 设计模式之模板方法模式(Template Method Pattern)

    模式的定义与特点 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤.它 ...

  2. 瑞幸离干掉星巴克还差几步?

    NEW 关注Tech逆向思维视频号 最新视频→[日本富翁抵达宇宙还秀了朋友圈,普通人可以吗?] 出品|新熵 文 | 樱木 编辑|月见 一个丑闻,重新洗牌. 星巴克中国新任CEO蔡德粦也没有想到自己的危 ...

  3. JAVA设计模式(14) —行为型模板方法模式(Template Method)

    1 定义: 模板方法模式(Template Method) Define the skeleton of an algorithm in anoperation, deferring some ste ...

  4. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的 ...

  5. java 模板方法_设计模式(java实现)_模板方法模式(Template method)

    设计模式(java实现)_模板方法模式(Template method) 模板方法模式是编程中经常用到到的模式.它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个 ...

  6. 瑞幸“踩”着星巴克登顶?

    来源 | 运营研究社 ID | U_quan 作者 |于丽言 郑宇轩 编辑 |杨佩汶 设计 |王浩南 3 月 24 日晚,瑞幸咖啡发布 2021 年 Q4 及全年财报,数据表现亮眼,较去年的净收入近乎 ...

  7. 商业逻辑认知:华为为何不倒?微软为何重生?瑞幸能干掉星巴克吗?

    文/技术领导力社区 编辑/Emma 华为为何崛起,为何屹立不倒?微软错过互联网时代.移动时代,为何又获得重生?瑞幸的对手是星巴克吗,战争何时打响?IBM为何砍掉PC业务? 任何一个商业组织都有它成长的 ...

  8. 设计模式之模板方法模式(Template Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  9. 趣谈设计模式 | 模板方法模式(Template Method):封装不变部分,扩展可变部分

    文章目录 案例:房屋建造 模板方法模式 模板方法模式与策略模式 总结 完整代码与文档 这个设计模式过于简单,所以不是很好举例- 案例:房屋建造 假设我们是建筑公司中的规划者,负责设定建筑方案,在初期我 ...

最新文章

  1. Matlab 频域滤波处理周期噪声图像(带阻滤波器滤波)
  2. 【冷门实用小工具】轻量级流程图工具ClickCharts PRO绿色版,ClickCharts PRO下载【亲测有效】
  3. “鸟枪换炮”,nanopore测序在宏基因组中的应用
  4. 皮一皮:所以说女生的好奇心不能太大...
  5. 开卡教程_流量卡开卡教程(必看)
  6. 人工智能们再也不用担心撞上玻璃橱窗了
  7. asp.net mvc 正常支持Fckeditor编辑器
  8. Redis基础系列-0x003:String
  9. Java—Map集合详解(HashMap/Hashtable/LinkedHashMap/Properties/TreeMap/WeakHashMap/IdentityHashMap/EnumMap)
  10. java.lang.IllegalStateException: closed
  11. 10-ESP8266 SDK开发基础入门篇--上位机通过串口控制ESP8266灯亮灭
  12. 作为一名开发者,没有实力和运气能干什么?
  13. [Curator] Barrier 的使用与分析
  14. Java保存class文件,[转载]Class文件在JVM中如何存储
  15. 程序设计语言基础知识复习
  16. mysql table key,MySQL中为table添加primary key的两种方法[多图]
  17. [Android]利用金山词霸API实现英汉互译APP
  18. [转]一个IT人的辞职信:怀着梦想去远行!
  19. flutter基于provider状态管理设置主题颜色、实现简单登录、注册功能---页面+逻辑
  20. java程序RedisTempla往redis存key后在redis客户端获取不到key

热门文章

  1. FreeCAD v0.19源码编译与VS2017+Qt5环境搭建
  2. Failed to capture snapshot of output files for task ' :packagePreDebug' property ''outputDirectory'
  3. php用户注册重复_php 验证用户名重复
  4. PHP高手干货分享:不能不看的50个细节!
  5. Django模板渲染——(二)
  6. 官方宣布:谷歌开发者中国网站正式发布!
  7. cisco交换机堆叠
  8. 002 Spring Restful案例
  9. Android应用的基本组件介绍
  10. CKFinder根据用户设置权限,不同用户有自己的私有的、独立的文件夹