Skip to content

Commit 0aec0e5

Browse files
committed
add visitor pattern
1 parent 9dea6d7 commit 0aec0e5

File tree

1 file changed

+55
-36
lines changed

1 file changed

+55
-36
lines changed

structural/visitor/visitor.go

Lines changed: 55 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,78 @@
11
package main
22

3-
import (
4-
"fmt"
5-
)
3+
import "fmt"
64

7-
type Parts interface {
8-
AcceptVisitor(Visitor)
5+
type Card interface {
6+
GetTitle() string
7+
GetPoints() int
98
}
109

11-
type Visitor interface {
12-
Visit(message *Message)
10+
type Visitable interface {
11+
Accept(v Visitor)
1312
}
1413

15-
type Message struct {
16-
Content string
14+
type Task struct {
15+
Title string
16+
Time int
1717
}
1818

19-
type LogMessage struct {
20-
parts []Parts
19+
func (b *Task) GetTitle() string {
20+
return b.Title
2121
}
2222

23-
type ConcreteVisitor struct {
24-
FullMessage []string
23+
func (b *Task) GetPoints() int {
24+
return b.Time
2525
}
2626

27-
func (aLog *Message) AcceptVisitor(visitor Visitor) {
28-
visitor.Visit(aLog)
27+
func (b *Task) Accept(v Visitor) {
28+
v.Visit(b)
2929
}
3030

31-
func (aLog *LogMessage) AcceptVisitor(visitor Visitor) {
32-
for _, part := range aLog.parts {
33-
part.AcceptVisitor(visitor)
34-
}
31+
type Bug struct {
32+
Title string
33+
Time int
3534
}
3635

37-
func (aLog *ConcreteVisitor) Visit(message *Message) {
38-
aLog.FullMessage = append(
39-
aLog.FullMessage,
40-
message.Content,
41-
)
36+
func (b *Bug) GetTitle() string {
37+
return b.Title
4238
}
4339

44-
func NewInfoLogString(message *Message) *LogMessage {
45-
aLog := new(LogMessage)
46-
aLog.parts = []Parts{
47-
&Message{"[yyyy-mm-dd]"},
48-
&Message{"INFO"},
49-
message,
50-
}
51-
return aLog
40+
func (b *Bug) GetPoints() int {
41+
return b.Time
42+
}
43+
44+
func (b *Bug) Accept(v Visitor) {
45+
v.Visit(b)
46+
}
47+
48+
type Visitor interface {
49+
Visit(t Card)
50+
}
51+
52+
type EstimationVisitor struct {
53+
Sum int
54+
}
55+
56+
func (e *EstimationVisitor) Visit(t Card) {
57+
e.Sum += t.GetPoints()
5258
}
5359

5460
func main() {
55-
msg := NewInfoLogString(&Message{"Messaggio"})
56-
visitor := new(ConcreteVisitor)
57-
msg.AcceptVisitor(visitor)
58-
fmt.Println(visitor.FullMessage)
61+
nextRelease := []Visitable{
62+
&Task{"Do stuff", 1},
63+
&Task{"Implement Foo Bar", 5},
64+
&Bug{"Error 500 on resource /foo/bar", 3},
65+
}
66+
67+
storyPoint := new(EstimationVisitor)
68+
69+
for _, i := range nextRelease {
70+
i.Accept(storyPoint)
71+
}
72+
73+
fmt.Println(
74+
"Next release is calulated in",
75+
storyPoint.Sum,
76+
"story points",
77+
)
5978
}

0 commit comments

Comments
 (0)