作者按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascriptpython两种语言实现。诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :)

原文地址是:《每天一个设计模式之组合模式》

欢迎关注个人技术博客:godbmw.com。每周 1 篇原创技术分享!开源教程(webpack、设计模式)、面试刷题(偏前端)、知识整理(每周零碎),欢迎长期关注!

如果您也想进行知识整理 + 搭建功能完善/设计简约/快速启动的个人博客,请直接戳theme-bmw

0. 项目地址

  • 组合模式·全部代码
  • 《每天一个设计模式》地址

1. 什么是“组合模式”?

组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。

  1. 用小的子对象构造更大的父对象,而这些子对象也由更小的子对象构成
  2. 单个对象和组合对象对于用户暴露的接口具有一致性,而同种接口不同表现形式亦体现了多态性

2. 应用场景

组合模式可以在需要针对“树形结构”进行操作的应用中使用,例如扫描文件夹、渲染网站导航结构等等。

3. 代码实现

这里用代码模拟文件扫描功能,封装了FileFolder两个类。在组合模式下,用户可以向Folder类嵌套File或者Folder来模拟真实的“文件目录”的树结构。

同时,两个类都对外提供了scan接口,File下的scan是扫描文件,Folder下的scan是调用子文件夹和子文件的scan方法。整个过程采用的是深度优先

3.1 python3 实现

class File:  # 文件类def __init__(self, name):self.name = namedef add(self):raise NotImplementedError()def scan(self):print('扫描文件:' + self.name)class Folder:  # 文件夹类def __init__(self, name):self.name = nameself.files = []def add(self, file):self.files.append(file)def scan(self):print('扫描文件夹: ' + self.name)for item in self.files:item.scan()if __name__ == '__main__':home = Folder("用户根目录")folder1 = Folder("第一个文件夹")folder2 = Folder("第二个文件夹")file1 = File("1号文件")file2 = File("2号文件")file3 = File("3号文件")# 将文件添加到对应文件夹中folder1.add(file1)folder2.add(file2)folder2.add(file3)# 将文件夹添加到更高级的目录文件夹中home.add(folder1)home.add(folder2)# 扫描目录文件夹home.scan()复制代码

执行$ python main.py, 最终输出结果是:

扫描文件夹: 用户根目录
扫描文件夹: 第一个文件夹
扫描文件:1号文件
扫描文件夹: 第二个文件夹
扫描文件:2号文件
扫描文件:3号文件
复制代码

3.2 ES6 实现

// 文件类
class File {constructor(name) {this.name = name || "File";}add() {throw new Error("文件夹下面不能添加文件");}scan() {console.log("扫描文件: " + this.name);}
}// 文件夹类
class Folder {constructor(name) {this.name = name || "Folder";this.files = [];}add(file) {this.files.push(file);}scan() {console.log("扫描文件夹: " + this.name);for (let file of this.files) {file.scan();}}
}let home = new Folder("用户根目录");let folder1 = new Folder("第一个文件夹"),folder2 = new Folder("第二个文件夹");let file1 = new File("1号文件"),file2 = new File("2号文件"),file3 = new File("3号文件");// 将文件添加到对应文件夹中
folder1.add(file1);folder2.add(file2);
folder2.add(file3);// 将文件夹添加到更高级的目录文件夹中
home.add(folder1);
home.add(folder2);// 扫描目录文件夹
home.scan();
复制代码

执行$ node main.js,最终输出结果是:

扫描文件夹: 用户根目录
扫描文件夹: 第一个文件夹
扫描文件: 1号文件
扫描文件夹: 第二个文件夹
扫描文件: 2号文件
扫描文件: 3号文件
复制代码

4. 参考

  • 《JavaScript 设计模式和开发实践》

每天一个设计模式之组合模式相关推荐

  1. 每天一个设计模式之 -- 组合模式

    组合模式 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结 ...

  2. 1、【设计模式】组合模式

    java设计模式之组合模式 [学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式 ...

  3. 详解设计模式:组合模式

    组合模式(Composite Pattern),又叫部分整体模式,是 GoF 的 23 种设计模式中的一种结构型设计模式. 组合模式 是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组 ...

  4. 结构型设计模式之组合模式

    结构型设计模式之组合模式 组合模式 应用场景 优缺点 主要角色 组合模式结构 分类 透明组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 安全组合模式 创建抽象根节点 创建树枝节点 创 ...

  5. java设计模式之组合模式(树形层级)

    java设计模式之组合模式 学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来 ...

  6. Java设计模式之组合模式详解

    文章目录 详解Java设计模式之组合模式 案例引入 组合模式 定义 模式类图结构 相关角色 典型代码 案例分析 类图设计 实例代码 结果分析 JavaJDK中的组合模式 透明组合模式 安全组合模式 组 ...

  7. 每日学一个设计模式1——迭代器模式

    引言 精通设计模式是从码农脱颖而出的条件之一.跟着<图解设计模式>这本书学习设计模式,从今天开始,一天总结一个设计模式. 迭代器模式(一个一个遍历) 用处 隐藏遍历集合的内部结构,遍历不同 ...

  8. Java设计模式之组合模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  9. 设计模式之组合模式(Composite)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

最新文章

  1. JSONObject和JSONArray(json-lib-2.4)的基本用法
  2. Win7桌面快捷切换技巧?
  3. 瘫痪17年,利用双向脑机接口来诱发触觉,控制机械手
  4. python好学实用吗-都说python很简单 真的很好学么?
  5. 脑电信号特征提取常用算法(共空间模式CSP、小波变换DWT、功率谱密度PSD、AR模型)
  6. springboot-web开发
  7. Oracle数据库中闪回恢复的详细分析
  8. spacy库的安装与使用_为 SpaCy 提供的中文数据模型
  9. java const string_深入研究Java String
  10. 《大数据》第2期“应用”——医疗健康大数据:应用实例与系统分析
  11. 银行有没有必要建立数据中台?看看这些架构师和技术总监怎么说
  12. EOC AAA用户管理开题报告规划
  13. 软件工程第二篇博客(“相等”)
  14. 光敏传感器实验报告_光敏电阻的光敏特性研究实验报告.doc
  15. 2021年高压电工考试报名及高压电工模拟试题
  16. SNIP——“自适应”型“狙击”策略 (目标检测)(two-stage)(深度学习)(CVPR 2018)
  17. 小白的proxmox ve(pve)打造AIO(all in boom)折腾日记 (二)装机篇(爱国者m2装机不完全教程)
  18. 关于短视频技术轮廓探讨
  19. R | 如何更新R版本及Rstudio
  20. 树莓派语音聊天机器人

热门文章

  1. 选择DataGrid中的CheckBox控件后该行背景变色
  2. __init__在python中的用法知乎_python使用selenium爬虫知乎的方法示例
  3. Java程序员面试如何超常发挥?
  4. onkeyup,onkeydown和onkeypress的区别介绍
  5. php 自定义属性,HTML5的data-*自定义属性是什么-
  6. flutter图标按钮_Flutter开发第一个项目android studio 开发工具的使用说明
  7. 基于运放AD8606的信号缓冲小板
  8. STC8G1K单片机软件执行时间物理测量
  9. 声音定位的距离误差到底有多高?
  10. gatdata获取曲线_GetData软件使用--获取曲线图中的数据