Go 原型模式讲解和代码示例

简介: Go 原型模式讲解和代码示例

01概念示例

让我们尝试通过基于操作系统文件系统的示例来理解原型模式 操作系统的文件系统是递归的 文件夹中包含文件和文件夹 其中又包含文件和文件夹 以此类推

每个文件和文件夹都可用一个 inode接口来表示  inode接口中同样也有 clone克隆功能

file文件folder文件夹结构体都实现了 print打印clone方法 因为它们都是 inode类型 同时 注意 filefolder中的 clone方法 这两者的 clone方法都会返回相应文件或文件夹的副本 同时在克隆过程中 我们会在其名称后面添加 _clone 字样

inode.go: 原型接口

package main
type inode interface {
    print(string)
    clone() inode
}

file.go: 具体原型

package main
import "fmt"
type file struct {
    name string
}
func (f *file) print(indentation string) {
    fmt.Println(indentation + f.name)
}
func (f *file) clone() inode {
    return &file{name: f.name + "_clone"}
}

folder.go: 具体原型

package main
import "fmt"
type folder struct {
    children []inode
    name      string
}
func (f *folder) print(indentation string) {
    fmt.Println(indentation + f.name)
    for _, i := range f.children {
        i.print(indentation + indentation)
    }
}
func (f *folder) clone() inode {
    cloneFolder := &folder{name: f.name + "_clone"}
    var tempChildren []inode
    for _, i := range f.children {
        copy := i.clone()
        tempChildren = append(tempChildren, copy)
    }
    cloneFolder.children = tempChildren
    return cloneFolder
}

main.go: 客户端代码

package main
import "fmt"
func main() {
    file1 := &file{name: "File1"}
    file2 := &file{name: "File2"}
    file3 := &file{name: "File3"}
    folder1 := &folder{
        children: []inode{file1},
        name:      "Folder1",
    }
    folder2 := &folder{
        children: []inode{folder1, file2, file3},
        name:      "Folder2",
    }
    fmt.Println("\nPrinting hierarchy for Folder2")
    folder2.print("  ")
    cloneFolder := folder2.clone()
    fmt.Println("\nPrinting hierarchy for clone Folder")
    cloneFolder.print("  ")
}

output.txt: 执行结果

Printing hierarchy for Folder2
  Folder2
    Folder1
        File1
    File2
    File3
Printing hierarchy for clone Folder
  Folder2_clone
    Folder1_clone
        File1_clone
    File2_clone
    File3_clone
相关文章
|
6天前
|
Go 索引
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
|
7月前
|
安全 Go
Go语言封装艺术:代码安全与结构清晰
Go语言封装艺术:代码安全与结构清晰
41 0
|
7月前
|
设计模式 编译器 Go
超实用!基于Go内嵌设计更优雅的代码
超实用!基于Go内嵌设计更优雅的代码
30 0
|
7月前
|
测试技术 Go
零代码上手测试:Go语言内置测试框架介绍
零代码上手测试:Go语言内置测试框架介绍
50 0
|
6天前
|
编译器 Go API
go generate指南:代码自动生成
go generate指南:代码自动生成
657 0
|
6天前
|
Go 微服务
4. 参考 go 代码——服务注册与发现
4. 参考 go 代码——服务注册与发现
|
6天前
|
编解码 JavaScript 前端开发
【专栏】介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例
【4月更文挑战第29天】本文介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例。Base64编码将24位二进制数据转换为32位可打印字符,用“=”作填充。文中展示了各语言的编码解码代码,帮助开发者理解并应用于实际项目。
|
6天前
|
存储 Go 开发者
Golang深入浅出之-Go语言字符串操作:常见函数与面试示例
【4月更文挑战第20天】Go语言字符串是不可变的字节序列,采用UTF-8编码。本文介绍了字符串基础,如拼接(`+`或`fmt.Sprintf()`)、长度与索引、切片、查找与替换(`strings`包)以及转换与修剪。常见问题包括字符串不可变性、UTF-8编码处理、切片与容量以及查找与替换的边界条件。通过理解和实践这些函数及注意事项,能提升Go语言编程能力。
28 0
|
6天前
|
存储 Go 索引
掌握Go语言:深入理解Go语言数组,基本原理与示例解析(15)
掌握Go语言:深入理解Go语言数组,基本原理与示例解析(15)
|
6天前
|
安全 编译器 Serverless
掌握Go语言:深入Go语言常量:代码稳定的关键(10)
掌握Go语言:深入Go语言常量:代码稳定的关键(10)