《golang设计模式》第二部分·结构型模式-03-组合模式(Composite)

文章目录

  • [1. 概述](#1. 概述)
    • [1.1 角色](#1.1 角色)
    • [1.2 类图](#1.2 类图)
  • [2. 代码示例](#2. 代码示例)
    • [2.1 设计](#2.1 设计)
    • [2.2 代码](#2.2 代码)
    • [2.3 类图](#2.3 类图)

1. 概述

将叶子节点和复合节点组合起来,定义一个抽象接口遍历他们

1.1 角色

  • Component(抽象构件):为叶子构件和复合构件声明接口,定义了结构树的操作,如整个结构的遍历等。
  • Leaf(叶子节点):叶子节点没有子节点。
  • Composite(复合节点):
    • 可以包含叶节点或其他复合节点。
    • 包含管理子节点的方法,如子节点的增加、删除、查询等。

1.2 类图

<<interface>> Component +Service() Leaf +Service() Composite +[]Component +Service() +Add(c Component) +Remove(c Component) +GetChild(c Component)

2. 代码示例

2.1 设计

  • 定义抽象构建Node
    • 它包含Get()方法遍历自己
  • 定义叶子节点FileNode
    • 它的Get()方法实现Node接口
    • 它的SetName()方法设置它的题目
    • 它的SetContent()方法设置它的内容
  • 定义复合节点DirNode
    • 它的Get()方法实现Node接口
    • 它的SetName()方法设置它的题目
    • 它的AddNode方法给添加子节点
    • 当然你也可以加删除等方法
  • 调用
    • 实例化一些复合节点和一些叶子节点
    • 将他们用复合节点的AddNode方法组合起来
    • 使用Get()方法遍历组装后的树结构

2.2 代码

go 复制代码
package main

import "fmt"
//定义一个抽象构建
type Node interface {
	Get(separator string)
	//SetName(name string)
}
//定义叶子节点
type FileNode struct {
	Name    string
	Content string
}
//它的查询方法实现接口
func (fileNode *FileNode) Get(separator string) {
	fmt.Printf("%s %q内容为:%s\n", separator, fileNode.Name, fileNode.Content)
}
//设置叶子节点内容
func (fileNode *FileNode) SetContent(content string) {
	fileNode.Content = content
}
//设置叶子节点标题
func (fileNode *FileNode) SetName(name string) {
	fileNode.Name = name
}
//定义复合节点
type DirNode struct {
	Name     string
	Contents []Node
}
//它的查询方法实现抽象接口
func (dirNode *DirNode) Get(separator string) {
	fmt.Printf("%s %q\n", separator, dirNode.Name)
	for _, node := range dirNode.Contents {
		node.Get(separator + separator)
	}
}
//设置复合节点的名字
func (dirNode *DirNode) SetName(name string) {
	dirNode.Name = name
}
//给复合节点加入子节点
func (dirNode *DirNode) AddNod(node Node) {
	dirNode.Contents = append(dirNode.Contents, node)
}

func main() {
	//实例化两个目录
	note := DirNode{}
	k8s := DirNode{}
	//实例化两个文件
	deployment := FileNode{}
	daemonSet := FileNode{}
	//设置目录名
	note.SetName("xuandeNode")
	k8s.SetName("k8s")
	//设置文件名和文件内容
	deployment.SetName("deployment")
	daemonSet.SetName("daemonSet")
	deployment.SetContent("balabalabala")
	daemonSet.SetContent("balabalabala")
	//组装目录
	note.AddNod(&k8s)
	k8s.AddNod(&deployment)
	k8s.AddNod(&daemonSet)
	//查看组装结果
	note.Get("----")
}
  • 输出
shell 复制代码
---- "xuandeNode"
-------- "k8s"
---------------- "deployment"内容为:balabalabala
---------------- "daemonSet"内容为:balabalabala 

2.3 类图

<<interface>> NodeOption +Get(separator string) FileNode +String Content +Get(separator string) +SetContent(content string) +SetName(name string) DirNode +[]NodeOption Contents +Get(separator string) +SetName(name string) +AddNod(node NodeOption)


相关推荐
Query*4 小时前
Java 设计模式——工厂模式:从原理到实战的系统指南
java·python·设计模式
mit6.8245 小时前
[Backstage] 后端插件 | 包架构 | 独立微服务 | by HTTP路由
架构
周杰伦_Jay6 小时前
【RocketMQ全面解析】架构原理、消费类型、性能优化、环境搭建
性能优化·架构·rocketmq
庸了个白6 小时前
一种面向 AIoT 定制化场景的服务架构设计方案
mqtt·设计模式·系统架构·aiot·物联网平台·动态配置·解耦设计
没有bug.的程序员8 小时前
服务治理与 API 网关:微服务流量管理的艺术
java·分布式·微服务·架构·wpf
驰羽9 小时前
[GO]golang接口入门:从一个简单示例看懂接口的多态与实现
开发语言·后端·golang
Guheyunyi9 小时前
风险感知中枢:监测预警系统的架构与核心
大数据·运维·安全·重构·架构·自动化
Meteors.10 小时前
23种设计模式——访问者模式 (Visitor Pattern)
设计模式·访问者模式
东城绝神10 小时前
《Linux运维总结:基于X86_64+ARM64架构CPU使用docker-compose一键离线部署consul 1.21.5容器版集群》
linux·运维·docker·架构·consul
Vallelonga10 小时前
Rust 设计模式 Marker Trait + Blanket Implementation
开发语言·设计模式·rust