GO设计模式——10、组合模式(结构型)
2023-12-14 16:42:31
目录
组合模式(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("--")
}
文章来源:https://blog.csdn.net/Gloming__zxy/article/details/134855029
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!