模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法的结构下,重新定义算法中的某些步骤。

这个模式是用来创建一个算法模板。模板就是一个方法。更具体地说,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。这可以确保算法的结构保持不变,同时由子类提供部分实现。

类图:

“钩子”的用处是让算法的这个部分是可选的,让子类选择实现这个钩子,但并不强制这么做。

在JDK8中的HashMap类中,就有这样的钩子:

// Callbacks to allow LinkedHashMap post-actionsvoid afterNodeAccess(Node<K,V> p) { }void afterNodeInsertion(boolean evict) { }void afterNodeRemoval(Node<K,V> p) { }

这三个是空实现的方法。

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {Node<K,V>[] tab; Node<K,V> p; int n, i;if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null);else {Node<K,V> e; K k;if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))e = p;else if (p instanceof TreeNode)e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);else {for (int binCount = 0; ; ++binCount) {if ((e = p.next) == null) {p.next = newNode(hash, key, value, null);if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                            treeifyBin(tab, hash);break;}if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))break;p = e;}}if (e != null) { // existing mapping for keyV oldValue = e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;afterNodeAccess(e);return oldValue;}}++modCount;if (++size > threshold)resize();afterNodeInsertion(evict);return null;
}

在LinkHashMap类中找到了afterNOdeInsertion的实现,其他两个钩子也有实现,这里只是不贴上来了。

void afterNodeInsertion(boolean evict) { // possibly remove eldestLinkedHashMap.Entry<K,V> first;if (evict && (first = head) != null && removeEldestEntry(first)) {K key = first.key;removeNode(hash(key), key, null, false, true);}
}

这其实就是一个模板方法模式的应用了,putVal作为一个模板方法,虽然它没有primitiveOperation方法的存在,因为HashMap并不是一个抽象类,所以不能有抽象的方法。

转载于:https://www.cnblogs.com/13jhzeng/p/5570342.html

模板方法模式(Template Pattern)相关推荐

  1. 7.1 模板方法模式 (Template Pattern)

    零. 行为型模式概述 1.定义 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个独个对象都无法单独完成的任务,它涉及算法与对象间职责的分配.行为型模式分为类 ...

  2. Net设计模式实例之模板方法模式(Template Mothed Pattern)(1)

    一.模板方法模式简介(Brief Introduction) 模板方法模式(Template Method Pattern),定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不 ...

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

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

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

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

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

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

  6. 使用 C# (.NET Core) 实现模板方法模式 (Template Method Pattern)

    本文的概念内容来自深入浅出设计模式一书. 项目需求 有一家咖啡店, 供应咖啡和茶, 它们的工序如下: 咖啡: 茶: 可以看到咖啡和茶的制作工序是差不多的, 都是有4步, 其中有两步它们两个是一样的, ...

  7. 模板方法模式(Template Method Pattern)学习笔记

    模板方法模式可以所是最为常见的一种设计模式了,出乎很多人意料的是,很多人已经在他们的代码中用到了模板方法模式而没有意识到自己用到了这个模式,模板方法模式几乎可以在所有的抽象基类中找到. 通过模板方法模 ...

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

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

  9. 模板方法模式(Template Method Pattern)

    模板方法模式: (就是在抽象基类中定一个复用的方法!) 在一个方法中定一个算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以再不改变算法结构的情况下,重新定义算法中的某些步骤. 实例: 泡茶 ...

  10. 不重复发明轮子 -- 模板模式 (Template Pattern) 介绍 使用场景案例分析 优缺点 及代码演示

    一句话概括: 一个抽象类公开定义了执行它的方法的方式/模板,它的子类可以重写方法实现,但调用将以抽象类中定义的方式进行. 补充介绍: 模板模式(Template Pattern)使得子类可以不改变一个 ...

最新文章

  1. 大转盘完整源码附效果图,可以下载直接用
  2. Cloudera Manager 5.3 和 CDH5.3.0 本地(离线)
  3. pku 1185 炮兵阵地
  4. web页面刷不出来 白色_今日头条连接超时刷不出来解决方案
  5. vue mxgraph渲染xml页面_Vue的两个版本
  6. 云现场 | 把开发者宠上天的节奏?恐怕也只有华为云啦!——记首次探访华为云“一日游...
  7. confirm的意思中文翻译_confirm的中文意思
  8. 1.1_简单递归 (汉诺塔问题 / 进制转换)
  9. bzoj 2141 : 排队 (cdq分治+bit)
  10. Hadoop的集群搭建windows基于VMware虚拟机超详细教程(一主二从)
  11. 极简图床 + 阿里云OSS 做图片外链
  12. 贵阳依托大数据勇闯改革深水区
  13. BZOJ 4698 Sdoi2008 Sandy的卡片
  14. 【rmzt:杀个浠巴烂win7主题】
  15. WEB 主机安全防护(Fail2ban + firewalld)_防止渗透猜解
  16. 复利单利计算的功能解释
  17. matlab零序五次谐波,五次谐波选线法的仿真分析
  18. android指南针Demo,谁有安卓简易指南针的DEmo
  19. java基于微信小程序的培训机构报名作业管理系统 uniapp 小程序
  20. python的range函数用法和实例

热门文章

  1. Oracle学习笔记--第2章 oracle 数据库体系结构
  2. VC编写自己构造http协议数据的post上传图片类(MFC环境 带编码转换)(转)
  3. Java中Integer包装类之间的比较问题
  4. 【POJ1144】Network
  5. 用结构体实现一个电话本
  6. JAVA基础代码分享--学生成绩管理
  7. 十种方法保持云中数据安全
  8. PHP验证邮箱地址代码
  9. Nagios—服务和性能监控
  10. Domino设置多台转发主机地址