每天一个设计模式之组合模式

栏目: 后端 · 发布时间: 7年前

内容简介:作者按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式可以在需要针对“树形结构”进行操作的应用中使用,例如扫描文件夹、渲染网站导航结构等等。

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

0. 项目地址

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

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

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

2. 应用场景

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

3. 代码实现

这里用代码 模拟文件扫描功能 ,封装了 FileFolder 两个类。在组合模式下,用户可以向 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号文件

以上所述就是小编给大家介绍的《每天一个设计模式之组合模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

离散数学及其应用(原书第7版)

离散数学及其应用(原书第7版)

Kenneth H. Rosen / 徐六通、杨娟、吴斌 / 机械工业出版社 / 2015-1-1 / 129

《计算机科学丛书:离散数学及其应用(原书第7版)》是介绍离散数学理论和方法的经典教材,已经成为采用率最高的离散数学教材,被美国众多名校用作教材,获得了极大的成功。中文版也已被国内大学广泛采用为教材。作者参考使用教师和学生的反馈,并结合自身对教育的洞察,对第7版做了大量的改进,使其成为更有效的教学工具。《计算机科学丛书:离散数学及其应用(原书第7版)》可作为1至2个学期的离散数学课入门教材,适用于数......一起来看看 《离散数学及其应用(原书第7版)》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具