天天一个设想形式之组合形式

作者按:《天天一个设想形式》旨在开端体会设想形式的精华,现在采纳
javascript
python两种言语完成。固然,每种设想形式都有多种完成体式格局,但此小册只纪录最直接了当的完成体式格局 :)

原文地点是:《天天一个设想形式之组合形式》

迎接关注个人手艺博客: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 = 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号文件

4. 参考

  • 《JavaScript 设想形式和开辟实践》
    原文作者:心谭
    原文地址: https://segmentfault.com/a/1190000017388587
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞