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()
self.facede.RegisterCommand(STARTUP, func() interfaces.ICommand { return &command.SimpleCommand{} })
self.facede.RegisterMediator(&mediator.Mediator{Name:"IMPLEMENTION"})
self.facede.RegisterProxy(&proxy.Proxy{Name:"IMPLEMENTION"}) }
|