用过Flex的人都知道有个基于MVC的puremvc框架,这个框架因为小巧简单很受欢迎。
PureMVC框架的目标很明确,即把程序分为低耦合的三层:Model、View和Controller。降低模块间的耦合性,各模块如何结合在一起工作对于创建易扩展,易维护的应用程序是非常重要的。在PureMVC实现的经典MVC元设计模式中,这三部分由三个单例模式类管理,分别是 Model、View和Controller。三者合称为核心层或核心角色。PureMVC中还有另外一个单例模式类—Facade,Facade提供了与核心层通信的唯一接口,以简化开发复杂度。
这里先放这个PureMVC这张著名的图:
这里就简单介绍了PureMVC一些简单知识,详情可以到puremvc.org 查看。这里我们不大去讲他的原理,只是通过一个例子来简单说下PureMVC的机制如何来运行一个Swing项目。
回到本文重点,因为PureMVC的小巧简单,所以作者也顺带着把他翻译成了C#,ColdFusion,Haxe,Java ,JavaScript ,Objective C ,PHP ,Python ,Ruby,那现在我们就以基于Java来做个Demo来讲讲PureMVC的运行原理。这个例子是一个小型系统的简单实现,首先弹出一个对话框,输入用户名和密码成功后进入系统,进行相关操作,所有动作都是利用PureMvc的机制发送消息,做到MVC的三层Model、View和Controller 分离。
由上图知道我们,程序的入口是Facade进去的,这个类是一个单类,一般我们都会继承这个类重写Facade,在程序启动的时候用他我们来注册命令等相关信息。所有的信息发送通过他来发送。在使用的时候我们一般继承他的initializeController方法用于加载初始化的一些 Command,比如点击菜单打开一个界面的信息,都是在这里预先注册,如代码:
public class ApplicationFacade extends Facade {
private static ApplicationFacade instance= null;
protected ApplicationFacade(){
super();
}
public static ApplicationFacade getInstance(){
if(instance == null)
instance = new ApplicationFacade();
return instance;
}
@Override
protected void initializeController() {
super.initializeController();
/** *//**
* 注册初始化的Command
* **/
registerCommand(ApplicationConstants.INITSTAR, InitStartCommand.class);
}
/** *//**
* 系统初始化完毕后调用这个发送INITSTAR,监听这个命令的Command
* 就会加载所有的Command
* **/
public void startup(){
sendNotification(ApplicationConstants.INITSTAR, null, null);
}
}