设计模式之模板&迭代器&组合模式

2230 查看


前言

这是本人的设计模式学习笔记,把自己学习过程中的一些总结和认识记录下来,与诸君共勉。本日为大家带来模板模式,迭代器模式,组合模式。

模板模式

基本概念

  • 钩子:一种方法,在抽象类中不做或只做默认的事,让子类选择是否覆盖
  • 模板:定义算法的基本骨架
  • 原语:模板中的单元动作,往往以方法实现

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

给出模板模式的结构示意图:

实现

  • 子类继承,覆盖钩子方法
  • 不需要显式的继承和类,只要分别对不同的应用对象实现模板里的原语方法

模板 vs 策略

  • 模板使用继承而策略使用对象组合的方式让客户选择算法实现
  • 模板减少了代码重复但策略更有弹性
  • 模板依赖程度更高

结语

模板的实际使用十分广泛,我们经常在使用时还未意识到这是模板模式。模板模式的许多变体也并不如标准形式那么规范,而被一眼认出。

迭代器模式

定义

提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露内部的表示。

迭代器的概念和聚合这一数据结构是紧密相关的,这一结构比较有代表性的有数组、vector、list等。迭代器是一个非常常用的工具,在许多现代语言中都提供了迭代器的实现。我们给出迭代器的结构示意图:

特性:

  • 迭代器允许访问聚合的元素而不暴露内部结构
  • 将聚合遍历的工作封装进一个对象
  • 依赖聚合提供遍历
  • 提供通用接口,使用多态机制

注意

  • 努力让一个类只完成一个责任
  • 不应该对迭代器取出的元素顺序作出假设

组合模式

定义

组合模式允许你将对象组合成树形结构来表现 整体/部分 的层次结构。组合让客户以一致的方式处理个别对象以及对象组合。

下面给出组合模式的结构示意图:

应用场景

一个为大家所熟知的就是dom树,每一个节点都暴露出了诸如on等通用接口,可以索引到它的子节点,可以说是一个非常典型的组合模式。

注意

  • 提供一个能同时包含个别对象和组合对象的结构
  • 实现时有许多设计上的折衷,在透明性和安全性之间

对于组合模式能说的并不多,就我个人而言,更多认为它只是一种数据结构上的扩展,即是利用组合来实现了多叉树的结构,然后对每个节点暴露相同的接口以将一些本来是结构相关的操作(比如遍历,指向孩子等)隐藏起来,让上层可以十分方便以树分支为单位进行操作而非是节点为单位。

设计原则

  • 单一责任原则:类应该只有一个改变的理由
  • 尽量避免底层调用高层以造成环形依赖