NOTE

6.19 组合模式

1. 定义 适用于整体与局部的树形结构,用于统一叶子节点和树节点的访问,并且可以用于应用某一操作到所有子节点。 2. uml 3. Java 3.1. client 3.2. 对象 4. Golang 4.1. 对象 4.2. client

Software Architecture & Engineering约 1 分钟读完historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 定义

适用于整体与局部的树形结构,用于统一叶子节点和树节点的访问,并且可以用于应用某一操作到所有子节点。

2. uml

PlantUML 图表

3. Java

3.1. client

public class Client
{
    public static void main(String[] args)
    {
        Directory file = new Directory();
        file.addChild(new ImageFile());

        file.killVirus();
    }
}

3.2. 对象

public class ImageFile implements File
{
    @Override
    public void killVirus()
    {
        System.out.println("image file 杀毒");
    }
}
public class Directory implements File
{
    private List<File> children = new ArrayList<>();

    public void addChild(File file)
    {
        this.children.add(file);
    }

    public void removeChild(File file)
    {
        this.children.remove(file);
    }


    @Override
    public void killVirus()
    {
        System.out.println("directory 杀毒");
        //天然的递归
        this.children.forEach(File::killVirus);
    }
}
public interface File
{
    void killVirus();
}

4. Golang

4.1. 对象

/*叶子节点和树节点的父类*/
type File interface {
	KillVirus()
	GetName() string
}

type abstractFile struct {
	Name string
}

func (a *abstractFile) GetName() string {
	return a.Name
}

/*叶子节点*/
type ImageFile struct {
	abstractFile
}

func NewImageFile(name string) *ImageFile {
	return &ImageFile{abstractFile: abstractFile{Name: name}}
}

func (i *ImageFile) KillVirus() {
	fmt.Printf("ImageFile[%s]杀毒\n", i.GetName())
}

/*树节点*/
type Directory struct {
	Children []File
	abstractFile
}

func NewDirectory(name string) *Directory {
	return &Directory{Children: make([]File, 0), abstractFile: abstractFile{Name: name}}
}

func (d *Directory) KillVirus() {
	fmt.Printf("Directory[%s]杀毒\n", d.GetName())

	for _, v := range d.Children {
		v.KillVirus()
	}
}

func (d *Directory) AddChild(file File) {
	d.Children = append(d.Children, file)
}

4.2. client

func main() {
	rootDir := 组合模式.NewDirectory("根目录")
	confDir := 组合模式.NewDirectory("配置目录")
	rootDir.AddChild(组合模式.NewImageFile("image-a.jpg"))
	rootDir.AddChild(组合模式.NewImageFile("image-b.jpg"))
	rootDir.AddChild(confDir)
	confDir.AddChild(组合模式.NewImageFile("nginx.conf"))

	rootDir.KillVirus()
}

讨论

使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看