基于抽象类的模板设计模式,核心是封装算法。

1、模板方法定义了一个算法的步骤,允许子类为一个或多个步骤提供具体实现。
2、模板(模板方法)模式:(典型:Servlet),AQS
 在一个方法中定义算法的框架,将一些具体步骤延迟到子类中实现。模板模式可以使子类在不改变算法的基础上,重新定义算法中的某些具体步骤。
3.开闭原则(OCP):一个软件实体,如类、函数、模块应对扩展开放,对修改关闭。(Java中最重要的原则)

23种设计模式?23种设计模式详解
第三方解耦(提取公有过程到一个类中—公有类)

咖啡/茶的冲泡法:
两者本质不同,但在冲泡过程中却有相似的步骤:

1.将水煮沸
2.用热水泡饮料
3.把饮料倒进杯子
4.在饮料内加入适当的调料

//设计一个通用的方法来实现冲泡的过程
void prepareRecipe(){boilWater();brew();pourInCup();addCondiments();
}
模板设计模式:
//模板设计模式abstract class CaffeineBeverage{//用同一个方法冲泡茶个咖啡final void prepareRecipe(){//final:不希望子类覆盖这个方法boilWater();//烧水步骤相同brew();pourInCup();//倒入杯中步骤相同addCondiments();}abstract void brew();abstract void addCondiments();void boilWater(){System.out.println("Boiling water");}void pourInCup(){System.out.println("Pouring into cup");}
}//处理茶类
class Tea extends CaffeineBeverage{void brew(){System.out.println("Steeping the tea");}void addCondiments(){System.out.println("Adding Lemon");}
}//处理咖啡
class Coffee extends CaffeineBeverage{void brew(){System.out.println("Dripping Coffee through filter");}void addCondiments(){System.out.println("Adding Sugar and Milk");}
}

此时的类图为:

完整的模板模式超类的定义:

//基类声明为抽象类,子类必须实现操作
abstract class AbstractClass{//模板方法,被声明为final以免子类改变算法的顺序final void templateMethod(){}//具体操作延迟到子类实现abstract void primitiveOperation1();abstract void primitiveOperation2();//具体操作、共用的方法定义在超类中,可以被模板方法或子类直接使用。final void concreateOperation(){//实现}//hook()是“默认不做事的方法”,子类可以根据情况决定是否覆盖它。void hook(){//钩子方法}
}

扩展类,引入“钩子”方法:

abstract class CaffeineBeverage{final void prepareRecipe(){boilWater();brew();pourInCup();//如果顾客想要加调料,才调用此加料方法if(customerWantsCondiments()){addCondiments();}}abstract void brew();abstract void addCondiments();void boilWater(){System.out.println("Boiling water");}void pourInCup(){System.out.println("Pouring into cup");}//钩子方法,超类中通常默认实现,子类可以选择性的覆写此方法boolean customerWantsCondiments(){return true;}
}
//处理茶类
class Tea extends CaffeineBeverage{void brew(){System.out.println("Steeping the tea");}void addCondiments(){System.out.println("Adding Lemon");}
}//处理咖啡
class Coffee extends CaffeineBeverage{void brew(){System.out.println("Dripping Coffee through filter");}void addCondiments(){System.out.println("Adding Sugar and Milk");}//子类覆写钩子方法,实现自定义功能public boolean customerWantsCondiments(){String answer = getUserInput();if(answer.equals("y")){return true;}else{return false;}}private String getUserInput(){String answer = null;System.out.println("您想要在咖啡中假如牛奶或糖吗(y/n)?");Scanner scanner = new Scanner(System.in);answer=scanner.nextLine();return answer;}
}public class Test{public static void main(String[] args){CaffeineBeverage tea = new Tea();CaffeineBeverage coffee= new Coffee();System.out.println("\nMaking tea...");tea.prepareRecipe();System.out.println("\nMaking coffee...");coffee.prepareRecipe();}
}
运行结果:

7.Java_模板设计模式---抽象类的实际应用(咖啡和茶的冲泡法),基于抽象类,核心是封装算法。引入钩子方法。开闭原则。23种设计模式相关推荐

  1. 七大原则+23种设计模式

    目录 设计模式的意义 1. 七大原则 1.1 单一职责原则 1.2 接口隔离原则 1.3 依赖倒转(倒置)原则 1.4 里氏替换原则 1.5 开闭原则 1.6 迪米特法则 1.7 合成复用原则 小结 ...

  2. 书读百遍其义自见 - 六大原则 23种设计模式

    作者: 西魏陶渊明 博客: https://blog.springlearn.cn/ 天下代码一大抄, 抄来抄去有提高, 看你会抄不会抄! 一.设计模式 设计模式一般分为三类:创建型模式.结构型模式. ...

  3. 设计模式学习(全)-七大基本原则-23种设计模式 超两万字总结!

    设计模式 一.设计模式七大原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特法则(最少知道原则) 6.里氏替换原则 7.合成/复用原则(组合/复用原则) 1.1 开闭 ...

  4. java与23种设计模式

    1 23种设计模式分类 经典的<设计模式>一书归纳出23种设计模式,本文按<易学设计模式>一书归纳分类如下: 1.创建型模式 前面讲过,社会化的分工越来越细,自然在软件设计方面 ...

  5. 23种设计模式-个人笔记(一)

    目录 一.认识设计模式 1.软件设计模式的概念与意义 1.1.软件设计模式的概念 1.2.学习设计模式的意义 2.设计模式的目的 3.什么是设计模式的原则 4.掌握设计模式的层次 5.软件设计模式的基 ...

  6. Java的7大设计原则和23种设计模式

    目录 一.UML类图 二. 设计原则 1.单一职责原则 2.里氏替换原则 3.依赖倒置原则 4.接口隔离原则 5.迪米特法则-最少知道原则 6.开闭原则 7.组合/聚合复用原则 三.Java中的23 ...

  7. 设计模式六大原则之--开闭原则(OCP)

    设计模式六大原则之--开闭原则(OCP) 前言 1 描述 2 理解: 3 问题由来: 4 使用LoD的好处: 5 难点: 6 最佳实践: 7 范例: 前言 The Open - Closed Prin ...

  8. 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  9. 23种设计模式——软件设计模式概述

    文章目录 23种设计模式--软件设计模式概述 1.软件设计模式的产生背景 2.软件设计模式的概念与意义 2.1. 软件设计模式的概念 2.2. 学习设计模式的意义 3.软件设计模式的基本要素 4.23 ...

最新文章

  1. 利用js实现table增加一行
  2. 安卓手机文件管理器简单横向评比 - imsoft.cnblogs
  3. 《Two Days DIV + CSS》读书笔记——CSS选择器
  4. html的div显示到最左侧,HTML/CSS:如何淡化div的左右边缘?
  5. Linux--Tail命令
  6. zynq7020安装linux图形界面,ZYNQ开发板的NFS文件系统安装 - ZYNQ7020学习
  7. html 将盒子固定浏览器,浏览器默认css样式表 css之左盒子固定,右盒子自适应的一种实现方式...
  8. Fortinet 推出集成化SD-WAN解决方案 构建下一代企业网
  9. 电脑换ip软件_如何使用爱加速换iP软件
  10. 浅析中断——回首两年
  11. APP开发手记01(app与web的困惑)
  12. 虎牙服务器升级维护中 请留意公告,魔渊之刃像素危城系列活动上线-更新公告1月21日...
  13. 如何搭建百度局域网离线地图服务器
  14. 鸟哥的linux私房菜中推荐的linux学习网站
  15. 伟大程序员必须具备的7个好习惯
  16. TIME_WAIT状态(2MSL)的作用
  17. vue 导出word带图片
  18. opengl 多边形线框_OpenGL - 在纹理多边形上创建边框
  19. Magic Number魔数是什么
  20. Phpstorm+phpstudy组合配置开发环境(Win端)

热门文章

  1. 如何开发景区导览app?景区导览app开发有哪些功能?
  2. CC2530,51单片机 延时一秒程序 循环次数 算法
  3. 1031 查验身份证 (15 分)
  4. 学习新方法:加强探索性测试技能
  5. python快速输入括号_pycharm 实现光标快速移动到括号外或行尾的操作
  6. Visio studio 基本控件
  7. 什么是数字签名?什么是数字证书?密码学知识?
  8. jtest java 代码_parasoft Jtest 使用教程:检查代码标准
  9. 关于ubuntu18.04ping不通网关以及外网的办法,自己总结
  10. weavenet简介