-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvisitor.go
110 lines (89 loc) · 1.87 KB
/
visitor.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package visitor
import "fmt"
// Visitor 访问者(visitor)
type Visitor interface {
VisitFile(*File)
VisitDirectory(*Directory)
}
// ListVisitor 具体的访问者(concrete visitor)
type ListVisitor struct {
currentDir string
}
func NewListVisitor() *ListVisitor {
return &ListVisitor{
currentDir: "",
}
}
func (l *ListVisitor) VisitFile(file *File) {
fmt.Println(l.currentDir + "/" + file.ToString())
}
func (l *ListVisitor) VisitDirectory(directory *Directory) {
fmt.Println(l.currentDir + "/" + directory.ToString())
saveDir := l.currentDir
l.currentDir = l.currentDir + "/" + directory.GetName()
for _, entry := range directory.Iterator() {
entry.Accept(l)
}
l.currentDir = saveDir
}
// Element 元素(element)
type Element interface {
Accept(Visitor)
GetName() string
GetSize() int
}
// File 具体的元素(concrete element)
type File struct {
name string
size int
}
func NewFile(name string, size int) *File {
return &File{
name: name,
size: size,
}
}
func (f *File) Accept(v Visitor) {
v.VisitFile(f)
}
func (f *File) GetName() string {
return f.name
}
func (f *File) GetSize() int {
return f.size
}
func (f *File) ToString() string {
return fmt.Sprintf("%s (%d)", f.GetName(), f.GetSize())
}
// Directory 具体的元素(concrete element)
type Directory struct {
name string
dir []Element
}
func NewDirectory(name string) *Directory {
return &Directory{
name: name,
}
}
func (d *Directory) Accept(v Visitor) {
v.VisitDirectory(d)
}
func (d *Directory) GetName() string {
return d.name
}
func (d *Directory) GetSize() int {
size := 0
for _, file := range d.dir {
size += file.GetSize()
}
return size
}
func (d *Directory) Add(element Element) {
d.dir = append(d.dir, element)
}
func (d *Directory) Iterator() []Element {
return d.dir
}
func (f *Directory) ToString() string {
return fmt.Sprintf("%s (%d)", f.GetName(), f.GetSize())
}