内容简介:作者按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式可以在需要针对“树形结构”进行操作的应用中使用,例如扫描文件夹、渲染网站导航结构等等。
作者按:《每天一个设计模式》旨在初步领会 设计模式 的精髓,目前采用 javascript
和 python
两种语言实现。诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :)
0. 项目地址
1. 什么是“组合模式”?
组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。
- 用小的子对象构造更大的父对象,而这些子对象也由更小的子对象构成
- 单个对象和组合对象对于用户暴露的接口具有一致性 ,而同种接口不同表现形式亦体现了多态性
2. 应用场景
组合模式可以在需要针对“树形结构”进行操作的应用中使用,例如扫描文件夹、渲染网站导航结构等等。
3. 代码实现
这里用代码 模拟文件扫描功能
,封装了 File
和 Folder
两个类。在组合模式下,用户可以向 Folder
类嵌套 File
或者 Folder
来模拟真实的“文件目录”的树结构。
同时,两个类都对外提供了 scan
接口, File
下的 scan
是扫描文件, Folder
下的 scan
是调用子文件夹和子文件的 scan
方法。整个过程采用的是 深度优先
。
3.1 python 3 实现
class File: # 文件类 def __init__(self, name): self.name = name def add(self): raise NotImplementedError() def scan(self): print('扫描文件:' + self.name) class Folder: # 文件夹类 def __init__(self, name): self.name = name self.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号文件
以上所述就是小编给大家介绍的《每天一个设计模式之组合模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 设计模式-享元设计模式
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
光线跟踪算法技术
萨芬 / 刘天慧 / 清华大学出版社 / 2011-3 / 98.00元
《光线跟踪算法技术》详细阐述了与光线跟踪问题相关的高效解决方案及相应的数据结构和算法,主要包括采样技术、投影视图、视见系统、景深、非线性投影、立体视觉、光照与材质、镜面反射、光泽反射、全局光照、透明度、阴影、环境遮挡、区域光照、光线与对象间的相交计算、对象变换、栅格技术以及纹理映射技术等内容。此外,《光线跟踪算法技术》还提供了相应的算法、代码以及伪代码,以帮助读者进一步理解计算方案的实现过程。 ......一起来看看 《光线跟踪算法技术》 这本书的介绍吧!