GO设计模式——10、组合模式(结构型)

目录

组合模式(Composite Pattern)   

优缺点

使用场景

代码实现


组合模式(Composite Pattern)   

        组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。它创建了对象组的树形结构,创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。组合最主要的功能是在整个树状结构上递归调用方法并对结果进行汇总。

        根节点和树枝节点本质上属于同一种数据类型,可以作为容器使用;而叶子节点与树枝节点在语义上不属于用一种类型。但是在组合模式中,会把树枝节点和叶子节点看作属于同一种数据类型(用统一接口定义),让它们具备一致行为。这样,在组合模式中,整个树形结构中的对象都属于同一种类型,带来的好处就是用户不需要辨别是树枝节点还是叶子节点,可以直接进行操作,给用户的使用带来极大的便利。

优缺点

(1)优点:

  • 高层模块调用简单。
  • 节点自由增加。

(2)缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

使用场景

  • 部分、整体场景,如树形菜单,文件、文件夹的管理。

代码实现

package main

import "fmt"

// 文件系统接口,文件和目录都要实现该接口
type FileSystemNode interface {
    Display(separator string)
}

// 文件通用功能
type FileCommonFunc struct {
    fileName string
}

// 设置文件名称
func (f *FileCommonFunc) SetFileName(fileName string) {
    f.fileName = fileName
}

// 文件类
type FileNode struct {
    FileCommonFunc
}

// 文件类显示文件内容
func (f *FileNode) Display(separator string) {
    fmt.Println(separator + f.fileName + "   文件内容为:Hello,world")
}

// 目录类
type DirectoryNode struct {
    FileCommonFunc
    nodes []FileSystemNode
}

// 目录类展示文件名
func (d *DirectoryNode) Display(separator string) {
    fmt.Println(separator + d.fileName)
    for _, node := range d.nodes {
       node.Display(separator + "--")
    }
}

// 添加目录或者文件
func (d *DirectoryNode) Add(f FileSystemNode) {
    d.nodes = append(d.nodes, f)
}

func main() {
    dict1 := DirectoryNode{}
    dict1.SetFileName("时间")
    file1 := FileNode{}
    file1.SetFileName("周一")
    file2 := FileNode{}
    file2.SetFileName("周二")
    file3 := FileNode{}
    file3.SetFileName("周三")
    dict2 := DirectoryNode{}
    dict2.SetFileName("会议")
    file4 := FileNode{}
    file4.SetFileName("早会")
    file5 := FileNode{}
    file5.SetFileName("周会")
    //组装
    dict1.Add(&file1)
    dict1.Add(&file2)
    dict1.Add(&file3)
    dict1.Add(&dict2)
    dict2.Add(&file4)
    dict2.Add(&file5)
    // 展示
    dict1.Display("--")
    dict2.Display("--")
}

相关推荐

  1. GO设计模式——10组合模式结构

    2023-12-08 21:06:01       27 阅读
  2. 笨蛋学设计模式结构模式-组合模式12

    2023-12-08 21:06:01       28 阅读
  3. GO设计模式——11、装饰器模式结构

    2023-12-08 21:06:01       35 阅读
  4. GO设计模式——13、享元模式结构

    2023-12-08 21:06:01       39 阅读
  5. GO设计模式——12、外观模式结构

    2023-12-08 21:06:01       40 阅读
  6. 设计模式-组合模式Composite(结构

    2023-12-08 21:06:01       9 阅读
  7. 设计模式结构设计模式——组合模式

    2023-12-08 21:06:01       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 21:06:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 21:06:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 21:06:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 21:06:01       20 阅读

热门阅读

  1. 【工具】机器之间传输文件的常用方式

    2023-12-08 21:06:01       38 阅读
  2. Nump数组的拼接详细教程

    2023-12-08 21:06:01       34 阅读
  3. mysql获取时间异常

    2023-12-08 21:06:01       40 阅读
  4. TypeScript中泛型对象、泛型类

    2023-12-08 21:06:01       41 阅读
  5. 【python】vscode中选择虚拟环境venv

    2023-12-08 21:06:01       38 阅读
  6. Linux DAC权限的简单应用

    2023-12-08 21:06:01       32 阅读
  7. 做题笔记:SQL Sever 方式做牛客SQL的题目--VQ34

    2023-12-08 21:06:01       32 阅读