博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板方法模式(Template Pattern)
阅读量:6405 次
发布时间:2019-06-23

本文共 2621 字,大约阅读时间需要 8 分钟。

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

 

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

 

类图:

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

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

// Callbacks to allow LinkedHashMap post-actions    void afterNodeAccess(Node
p) { } void afterNodeInsertion(boolean evict) { } void afterNodeRemoval(Node
p) { }

这三个是空实现的方法。

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,                   boolean evict) {        Node
[] tab; Node
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
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
)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 key V 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 eldest        LinkedHashMap.Entry
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

你可能感兴趣的文章
[分享] 很多人手机掉了,却不知道怎么找回来。LZ亲身经历讲述手机找回过程,申请加精!...
查看>>
新的博客,新的开始!
查看>>
WPF 自定义DataGrid控件样式
查看>>
「CH2501」 矩阵距离 解题报告
查看>>
前端之CSS内容
查看>>
iOS UILable如何实现自适应
查看>>
JavaFX ImageView
查看>>
用ElasticSearch存储日志
查看>>
Dubbo 分布式服务框架简介
查看>>
MPU6050可以读取器件ID值,但读出的加速度计和陀螺仪的数据均为零
查看>>
路由器开发板上的TTL线连接方法
查看>>
javaweb中为mysql的curd多个值的语句
查看>>
YYHS-NOIP模拟赛-gcd
查看>>
JMeter学习使用(1) - 接口GET请求并发测试
查看>>
HDU - 6444 Neko's loop(循环节+最大子段和)
查看>>
使用 Docker 搭建 Java Web 运行环境
查看>>
HDU3709:Balanced Number(数位dp)
查看>>
系统中同时存在python2和python3时 pip有时候更新后会报错 解决安装的方法如下
查看>>
Lightoj 1428 后缀数组
查看>>
RESTful
查看>>