-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathmvc.go
101 lines (80 loc) · 1.9 KB
/
mvc.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
package main
import "fmt"
/*
MVC 模式
- Model:负责业务逻辑和数据处理,直接与数据库或数据源交互。
- View:负责渲染用户界面,显示数据给用户。View可与Model绑定。
- Controller:作为用户输入的中介,接收用户的输入并更新 Model 或 View。
*/
// Model (数据模型)
type Model struct {
name string
num int
}
func NewModel() *Model {
return &Model{name: "MVC Basic", num: 1}
}
func (m *Model) GetName() string {
return m.name
}
func (m *Model) SetNum(num int) {
m.num = num
}
func (m *Model) GetNum() int {
return m.num
}
func (m *Model) IncrementNum(value int) {
m.num += value
}
func (m *Model) SetName(name string) {
m.name = name
}
// View (视图层)
type View struct {
model *Model
}
func NewView(model *Model) *View {
return &View{model: model}
}
func (v *View) UpdateView() {
fmt.Printf("<div><b>%s</b><em>%d</em></div>\n", v.model.GetName(), v.model.GetNum())
}
// Controller (控制器)
type Controller struct {
model *Model
view *View
}
func NewController(model *Model, view *View) *Controller {
return &Controller{model: model, view: view}
}
func (c *Controller) OnButtonClick() {
c.model.SetName("onButtonClick")
c.model.IncrementNum(1)
c.updateView()
}
func (c *Controller) OnMouseOut() {
c.model.SetName("onMouseOut")
c.model.SetNum(0)
c.updateView()
}
func (c *Controller) updateView() {
c.view.UpdateView()
}
// Test
func main() {
model := NewModel()
// view可以绑定model
view := NewView(model)
controller := NewController(model, view)
fmt.Println("Test 1: Button Click")
controller.OnButtonClick()
fmt.Println("Test 2: Mouse Out")
controller.OnMouseOut()
}
/*
jarry@MacBook-Pro mvc % go run mvc.go
Test 1: Button Click
<div><b>onButtonClick</b><em>2</em></div>
Test 2: Mouse Out
<div><b>onMouseOut</b><em>0</em></div>
*/