go 示例
最后更新于:2022-04-02 04:19:20
[TOC]
## 概念示例
通过基于操作系统文件系统的示例来理解原型模式
```
package main
import (
"fmt"
"strings"
)
// 原型接口
type inode interface {
print(string) string
clone() inode
}
// 具体原型:文件
type file struct {
name string
}
func (f *file) print(indentation string) string {
return indentation + f.name + "_clone" + "\n"
}
func (f *file) clone() inode {
return &file{name: f.name}
}
// 具体原型:目录
type folder struct {
childrens []inode
name string
}
func (f *folder) print(indentation string) string {
builder := strings.Builder{}
builder.WriteString(indentation + f.name + "\n")
for _, i := range f.childrens {
builder.WriteString(i.print(indentation + indentation))
}
return builder.String()
}
func (f *folder) clone() inode {
cloneFolder := &folder{name: f.name + "_clone"}
var tempChildrens []inode
for _, i := range f.childrens {
tempChildrens = append(tempChildrens, i.clone())
}
cloneFolder.childrens = tempChildrens
return cloneFolder
}
func main() {
file1 := &file{name: "File1"}
file2 := &file{name: "File2"}
file3 := &file{name: "File3"}
folder1 := &folder{
childrens: []inode{file1},
name: "Folder1",
}
folder2 := &folder{
childrens: []inode{folder1, file2, file3},
name: "Folder2",
}
fmt.Printf("%+v\n", folder2.print(" "))
cloneFolder := folder2.clone()
fmt.Printf("%+v\n", cloneFolder.print(" "))
}
```
输出
```
Folder2
Folder1
File1_clone
File2_clone
File3_clone
Folder2_clone
Folder1_clone
File1_clone
File2_clone
File3_clone
```
';