forked from AlexanderGrom/go-patterns
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathstate.go
50 lines (40 loc) · 1.95 KB
/
state.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
// Паттерн Состояние (State)
//
// В примере описываются варианты оповещения пользователя мобильного телефона.
// На самом деле, хорошо было бы реализовать смену состояния внутри системы
// оповещения (ModileAlert), покаким либо критериям. Например, задействуя файл конфигруции.
// Но для упращения примера, используется внешняя смена состояния, посредствам метода SetState()
package state
// Тип ModileAlertStater, описывает общий интерфейс для различных состояний
type ModileAlertStater interface {
Alert() string
}
// Тип ModileAlert, реализует оповещение в зависимости от своего состояния
type ModileAlert struct {
state ModileAlertStater
}
// Оповещение в зависимости от внутреннего состояния
func (self *ModileAlert) Alert() string {
return self.state.Alert()
}
// Меняет состояние
func (self *ModileAlert) SetState(state ModileAlertStater) {
self.state = state
}
func NewModileAlert() *ModileAlert {
return &ModileAlert{state: &MobileAlertVibration{}}
}
// Тип MobileAlertVibration, реализует оповещение только вибрацией
type MobileAlertVibration struct {
}
// Оповещение вибрацией
func (self *MobileAlertVibration) Alert() string {
return "Vrrr... Brrr... Vrrr..."
}
// Тип MobileAlertSong, реализует оповещение только звуковым сигналом
type MobileAlertSong struct {
}
// Оповещение звуком
func (self *MobileAlertSong) Alert() string {
return "Белые розы, Белые розы. Беззащитны шипы..."
}