设计模式——组合模式

定义

组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。

节点

组合模式结构为一颗二叉树,存在三种节点

  1. Component:组合模式结构的根节点
  2. Composite:树枝节点,子节点可以为树枝节点或者叶子节点
  3. Leaf: 叶子节点,没有子节点

模式特点

  1. 表示 “部分-整体” 的层次结构,生成 "树叶型" 结构;
    • 树结构,子节点为叶子节点或者树枝和节点。叶子节点没有子节点,树枝节点存放子属性,也为叶子节点或者树枝节点。树枝节点通常为数组结构
  2. 一致操作性,树叶对象对外接口保存一致(操作与数据结构一致);
    • 需要保证每个叶子节点的接口一致,才能通过遍历统一调用
  3. 自上而下的的请求流向,从树对象传递给叶对象;
  4. 调用顶层对象,会自行遍历其下的叶对象执行。

 代码实现

interface Compose {
    name: string,
    add(file: CFile): void,
    scan(): void
}
class CFile implements Compose {
    name: string
    constructor(name: string) {
        this.name = name
    }
    add(file: CFile) {
        throw new Error('No')
    }
    scan() {
        console.log(this.name)
    }
}
class CFolder implements Compose {
    fileList = []
    name: string
    constructor(name: string) {
        this.name = name
    }
    add(file: CFile) {
        this.fileList.push(file)
    }
    scan() {
        for (let file of this.fileList) {
            file.scan()
        }
    }
}
let carFolder = new CFolder('车')
let eCarFolder = new CFolder('电车')
let oCarFoldere = new CFolder('油车')
let car1 = new CFile('特斯拉')
let car2 = new CFile('宝马M4')
eCarFolder.add(car1)
oCarFoldere.add(car2)
carFolder.add(eCarFolder)
carFolder.add(oCarFoldere)
carFolder.scan()

 

posted on 2024-01-22 18:11  Karle  阅读(4)  评论(0编辑  收藏  举报