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

本文共 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

你可能感兴趣的文章
剑破冰山—Oracle开发艺术 书评(by yangtingkun)
查看>>
如何用手机维护Mysql数据库
查看>>
REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框&&获取组件实例常用的两种方式...
查看>>
基于CentOS 5.3平台下搭建PXE部署ESX&ESXi 4.x模板分发服务器 v1.0
查看>>
使用tornado模板引擎配合yaml构建nginx配置接口 [扩展saltstack]
查看>>
网络作者的心声-1、感谢读者,我不会太监
查看>>
WCF分布式开发常见错误解决(1):添加服务引用出错
查看>>
Nginx实战基础篇六 通过源码包编译安装部署LNMP搭建Discuz论坛
查看>>
如何根据指定软件版本制作属于自己的puppet yum源
查看>>
Linux下架设rsync服务器
查看>>
Struts2教程8:拦截器概述
查看>>
windows 屏幕坐标 窗口坐标 客户区坐标 逻辑坐标 设备坐标之间的关系及转换
查看>>
在Foreda8上试安装Apchehttpd-2.4.6.tar.gz
查看>>
基于S3C2410的VIVI移植
查看>>
Entity Framwork one to one problem
查看>>
[转] Attach、Detach和DeleteObject
查看>>
[转] C# 获取程序运行目录
查看>>
【OpenCV学习】极坐标变换
查看>>
[Android Pro] InputStream.skip方法的思考
查看>>
判断页面加载
查看>>