golang版PureMvc框架

重点

PureMVC框架的目标很明确,即把程序分为低耦合的三层:Model、View和Controller。它们合称为PureMVC框架的核心,由Facade统一管理。关于它的核心层,我们不需要管太多,只需要记得下面几点就可以了:

  • 一、Model保存对Proxy对象的引用,Proxy负责操作数据模型,与远程服务通信存取数据。

  • 二、View保存对Mediator对象的引用。由Mediator对象来操作具体的视图组件(View Component,例如Flex的DataGrid组件),包括:添加事件监听器,发送或接收Notification ,直接改变视图组件的状态。

  • 三、Controller保存所有Command的映射。Command可以获取Proxy对象并与之交互,通过发送Notification来执行其他的Command。

上面的什么对什么的引用,可以一开始看的时候很难理解,我们暂时不用管它谁对谁的引用的。这些已经由框架为我们管理好了,我们要所要做的是编写具体的Command,Mediator,Proxy。

  • 一、Proxy是负责操作数据模型的,什么是数据模型?数据模型就是数据库,XML等等。我们可以直观地理解为,Proxy是用来对数据模型进行查询、插入、更新、删除等操作的类。操作完成后,它就会发送Notification,也就是通知,告诉其它两个层我已经完成工作了。(只发消息不接收消息)

  • 二、Mediator负责操作具体的视图组件,包括:添加事件监听器,发送或接收Notification ,直接改变视图组件的状态。好像抽象了点。具体的说吧,Mediator是负责管理用户界面,与用户进行交互操作的。如:给Button添加事件,当用户点击按钮时,发送Notification,告诉Controler我们执行什么样的操作。比如这是一个登录的按钮,那么Mediator就会告诉发送通知给Controler,告诉它要执行登录操作。此外,Mediator还负责直接改变视图的状态。就像,我点击了登录按钮后,Mediator就改变它,让登录按钮不过用,避免重复操作。它还可以在视图上显示一条信息,告诉我正在执行登录操作。总的来说,Mediator是用来管理视图的。(初始化时把view传入Mediator中)

  • 三、Command可以获取Proxy对象并与之交互,通过发送Notification来执行其他的Command。再拿上面的登录例子作解。(在command中使用facade.RetrieveProxy获取Proxy对象)

1
2
3
# 调用流程
ui->Mediator->Proxy->model
Command->Proxy->model->Mediator->ui

目录

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

├─Controller
│ ├─ AddRoleResultCommand.cs
│ ├─ DeleteUserCommand.cs
│ └─ StartupCommand.cs // 启动

├─Model
│ ├─ RoleProxy.cs
│ ├─ UserProxy.cs
│ └─VO
│ ├─ RoleVO.cs
│ └─ UserVO.cs

└─View
├─ RolePanelMediator.cs
├─ UserFormMediator.cs
├─ UserListMediator.cs

└─UI
├─ RolePanel.xaml
├─ RolePanel.xaml.cs
├─ UserForm.xaml
├─ UserForm.xaml.cs
├─ UserList.xaml
└─ UserList.xaml.cs

puremvc初始化流程

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
package model

import (
"github.com/puremvc/puremvc-go-multicore-framework/src/interfaces"
"github.com/puremvc/puremvc-go-multicore-framework/src/patterns/command"
"github.com/puremvc/puremvc-go-multicore-framework/src/patterns/facade"
"github.com/puremvc/puremvc-go-multicore-framework/src/patterns/mediator"
"github.com/puremvc/puremvc-go-multicore-framework/src/patterns/proxy"
)

const (
STARTUP = "startup"
)

var instance *applicationFacade

type applicationFacade struct {
facede interfaces.IFacade
}

func GetFacadeInstance() *applicationFacade {
if instance == nil {
instance = new(applicationFacade)
instance.facede = facade.GetInstance("instance", func() interfaces.IFacade {
return &facade.Facade{Key: "instance"}
})
instance.InitializeController()
}
return instance
}

func (self *applicationFacade) Startup(app interface{}) {
self.facede.SendNotification(STARTUP, app,"")
}

func (self *applicationFacade) InitializeController() {

// 初始化
self.facede.InitializeController()

// 注册command
self.facede.RegisterCommand(STARTUP, func() interfaces.ICommand {
return &command.SimpleCommand{} //
})

// 注册Mediator
self.facede.RegisterMediator(&mediator.Mediator{Name:"IMPLEMENTION"})

// 注册Proxy
self.facede.RegisterProxy(&proxy.Proxy{Name:"IMPLEMENTION"})
}

// 使用
// facade := GetFacadeInstance()
// facade.Startup()