【设计模式】第10节:结构型模式之“组合模式”

一、简介

组合模式:将一组对象组织成树形结构,将单个对象和组合对象都看做树中的节点,以统一处理逻辑,并且它利用树形结构的特点,递归地处理每个子树,依次简化代码实现。使用组合模式的前提在于,业务场景必须能够表示成树形结构。

二、 UML类图

【设计模式】第10节:结构型模式之“组合模式”_第1张图片

三、案例

以下是电脑文件系统的案例,文件系统是树形结构的,包含文件、文件夹两种类型的对象。它们都具有获取文件数和获取路径两个方法。

package main
import "fmt"

type FileSystemNode interface {
    CountNumOfFiles() int64
    GetPath() string
}

type File struct {
    path string    
}

func (f File) CountNumOfFiles() int64 {
    return 1
}

func (f File) GetPath() string {
    return f.path
}

type Directory struct {
    path string
    subNodes []FileSystemNode
}

func (d Directory) CountNumOfFiles() int64 {
    numOfFiles := int64(0)
    for i := 0; i < len(d.subNodes); i++ {
        node := d.subNodes[i]
        numOfFiles += node.CountNumOfFiles()
    }
    return numOfFiles
}

func (d Directory) GetPath() string {
    return d.path
}

func (d *Directory) AddSubNode(node FileSystemNode) {
    d.subNodes = append(d.subNodes, node)
}

func NewDirectory(path string) *Directory {
    directory := new(Directory)
    directory.path = path
    return directory
}

func NewFile(path string) *File {
    file := new(File)
    file.path = path
    return file
}

func main () {
    fileSystemTree := NewDirectory("/")
    node_wz := NewDirectory("/wz/")
    node_ab := NewDirectory("/ab/")
    node_xzg := NewDirectory("/xzg/")
    node_wz_a := NewFile("/wz/a.txt")
    node_ab_a := NewFile("/ab/a.txt")
    node_ab_b := NewFile("/ab/b.txt")

    node_wz.AddSubNode(*node_wz_a)
    node_ab.AddSubNode(*node_ab_a)
    node_ab.AddSubNode(*node_ab_b)
    fileSystemTree.AddSubNode(*node_wz)
    fileSystemTree.AddSubNode(*node_ab)
    fileSystemTree.AddSubNode(*node_xzg)

    fmt.Printf("/ files num: %v\n", fileSystemTree.CountNumOfFiles())
    fmt.Printf("/wz/ files num: %v\n", node_wz.CountNumOfFiles())
    fmt.Printf("txt file path: %v\n", node_wz_a.GetPath())
}

你可能感兴趣的:(设计模式,组合模式)