forked from AlexanderGrom/go-patterns
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmediator.go
119 lines (100 loc) · 2.92 KB
/
mediator.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
111
112
113
114
115
116
117
118
119
// Паттерн Посредник (Mediator)
//
package mediator
// Тип Mediator, описывает интерфейс для просредника
type Mediator interface {
ConnectColleagues()
Send(msg string)
}
// Тип Colleague, описывает интерфейс процесса взаимодействия
// объектов-коллег с объектом типа Mediator;
type Colleague interface {
setMediator(mediator Mediator)
}
// Тип ConcreteMediator, реализует посредника
type ConcreteMediator struct {
*Farmer
*Cannery
*Shop
}
// Подключить коллег
func (self *ConcreteMediator) ConnectColleagues() {
self.Farmer.setMediator(self)
self.Cannery.setMediator(self)
self.Shop.setMediator(self)
}
// Общение с коллегами
func (self *ConcreteMediator) Send(msg string) {
if msg == "Farmer: Tomato complete..." {
self.Cannery.money -= 15000.00
self.Farmer.money += 15000.00
self.Cannery.MakeKetchup(self.Farmer.GetTomato())
} else if msg == "Cannery: Ketchup complete..." {
self.Shop.money -= 30000.00
self.Cannery.money += 30000.00
self.Shop.SellKetchup(self.Cannery.GetKetchup())
}
}
func NewMediator() *ConcreteMediator {
mediator := &ConcreteMediator{}
mediator.ConnectColleagues()
mediator.Farmer.money = 7500.00
mediator.Cannery.money = 15000.00
mediator.Shop.money = 30000.00
return mediator
}
// Тип Farmer, реализует коллегу Фермер
type Farmer struct {
mediator Mediator
tomato int
money float64
}
// Установить посредника
func (self *Farmer) setMediator(mediator Mediator) {
self.mediator = mediator
}
// Фермер выращивает помидоры
func (self *Farmer) GrowTomato(tomato int) {
self.tomato = tomato
self.money -= 7500.00
self.mediator.Send("Farmer: Tomato complete...")
}
// Получить помидоры
func (self *Farmer) GetTomato() int {
return self.tomato
}
// Тип Cannery, реализует коллегу Завод
type Cannery struct {
mediator Mediator
ketchup int
money float64
}
// Установить посредника
func (self *Cannery) setMediator(mediator Mediator) {
self.mediator = mediator
}
// Завод перерабатывает помидоры в кетчуп
func (self *Cannery) MakeKetchup(tomato int) {
self.ketchup = tomato
self.mediator.Send("Cannery: Ketchup complete...")
}
// Получить кетчуп
func (self *Cannery) GetKetchup() int {
return self.ketchup
}
// Тип Shop, реализует коллегу Магазин
type Shop struct {
mediator Mediator
money float64
}
// Установить посредника
func (self *Shop) setMediator(mediator Mediator) {
self.mediator = mediator
}
// Магазин продает кетчуп
func (self *Shop) SellKetchup(ketchup int) {
self.money = float64(ketchup) * 54.75
}
func (self *Shop) GetMoney() float64 {
return self.money
}