前言
这是本人的设计模式学习笔记,把自己学习过程中的一些总结和认识记录下来,与诸君共勉。本日为大家带来模板模式,迭代器模式,组合模式。
模板模式
基本概念
- 钩子:一种方法,在抽象类中不做或只做默认的事,让子类选择是否覆盖
- 模板:定义算法的基本骨架
- 原语:模板中的单元动作,往往以方法实现
模板方法模式指在一个方法中定义一个算法的骨架,进而将一些步骤的实现延迟到子类中,使得子类可以在不改变算法结构的前提下重定义算法步骤。
给出模板模式的结构示意图:
实现
- 子类继承,覆盖钩子方法
- 不需要显式的继承和类,只要分别对不同的应用对象实现模板里的原语方法
模板 vs 策略
- 模板使用继承而策略使用对象组合的方式让客户选择算法实现
- 模板减少了代码重复但策略更有弹性
- 模板依赖程度更高
结语
模板的实际使用十分广泛,我们经常在使用时还未意识到这是模板模式。模板模式的许多变体也并不如标准形式那么规范,而被一眼认出。
迭代器模式
定义
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露内部的表示。
迭代器的概念和聚合这一数据结构是紧密相关的,这一结构比较有代表性的有数组、vector、list等。迭代器是一个非常常用的工具,在许多现代语言中都提供了迭代器的实现。我们给出迭代器的结构示意图:
特性:
- 迭代器允许访问聚合的元素而不暴露内部结构
- 将聚合遍历的工作封装进一个对象
- 依赖聚合提供遍历
- 提供通用接口,使用多态机制
注意
- 努力让一个类只完成一个责任
- 不应该对迭代器取出的元素顺序作出假设
组合模式
定义
组合模式允许你将对象组合成树形结构来表现 整体/部分 的层次结构。组合让客户以一致的方式处理个别对象以及对象组合。
下面给出组合模式的结构示意图:
应用场景
一个为大家所熟知的就是dom树,每一个节点都暴露出了诸如on等通用接口,可以索引到它的子节点,可以说是一个非常典型的组合模式。
注意
- 提供一个能同时包含个别对象和组合对象的结构
- 实现时有许多设计上的折衷,在透明性和安全性之间
对于组合模式能说的并不多,就我个人而言,更多认为它只是一种数据结构上的扩展,即是利用组合来实现了多叉树的结构,然后对每个节点暴露相同的接口以将一些本来是结构相关的操作(比如遍历,指向孩子等)隐藏起来,让上层可以十分方便以树分支为单位进行操作而非是节点为单位。
设计原则
- 单一责任原则:类应该只有一个改变的理由
- 尽量避免底层调用高层以造成环形依赖