基本框架图:
单例代码(经常要用到):
public class FlickrModelLocator implements IModelLocator
{
private static var _instance:FlickrModelLocator;
public function FlickrModelLocator(enforcer:ModelSingletonEnforcer)
{
if(enforcer==null)
{
throw new Error("You can only have one flickrModelLocator");
}
}
public static function getInstance():FlickrModelLocator
{
if(!_instance)
{
_instance=new FlickrModelLocator(new ModelSingletonEnforcer);
}
return _instance;
}
//这个类是用于防止外部类去实例化
class ModelSingletonEnforcer{}
cairngorm内容:
bussiness:与服务器交互,并返回结束给common
common:调用bussiness方法,来请求服务器。 用bussiness返回的数据,来更新model,model是给view绑定的。
control:只是集中注册并管理事件(Event)与命今(Command)的映射关系,在主窗体中实例化
event:继承extends CairngormEvent,定义事件名
model:改变该类的值,View也会变,因为View是绑定该类的。实现implements IModelLocator接口,单例类,[Bindable]
view: 前端界面,绑定读取model
vo:就是实体类,实现implements IValueObject接口
1. 前端控制器(FrontController)监听用户行为
前端控制器是Cairngorm事件的唯一监听者,但其不并做任何操作,只是集中注册并管理事件(Event)与命今(Command)的映射关系。
操作:
1.类要继承extends FrontController
2.addCommand(FlickrEvent.PHOTOS_SEARCH,SearchCommand);
//这里变事件FlickrEvent.PHOTOS_SEARCH映射到SearchCommand类中,SearchCommand类要实现implements ICommand接口,当执行FlickrEvent.PHOTOS_SEARCH这个事件时,就会调用SearchCommand中的execute(event:CairngormEvent)方法。
3.FrontController这个文件要在主窗体中注册,以便绑定事件
xmlns:control1="com.album.control.*"
<control1:FlickrFrontController></control1:FlickrFrontController>
2. 命令(Commands)执行所有用户操作
前端控制品(FrontController)监听到事件与命令有匹配时,便告诉命令(Commmands)调用execute()方法处理事件。
调用bussiness方法,来请求服务器。 用bussiness返回的数据,来更新model,model是给view绑定的。实现IResponder这个接口
当然如果没有与服务器交互就不要调用bussiness,也不要实现IResponder这个接口
3. 服务器端业务逻辑委托给Business Delegate
当命令(Commands)执行时,它只是关心是否获取到数据,而并不关心获取到什么具体数据。因为经常需要从服务器端获取数据,此时命令(Commands)更喜欢把它委托给其它类去操作。所以需要处理服务器端业务逻辑的时候,你都可以委托给命令(Commands)可以调用的Business Delegate类去处理。
与服务器交互,并返回结束给common来处理
4. 在Model Locator保存状态并且让Model通知View
Model Locator是一个保存应用程序全部状态和包含Value Objects的地方。当应用程序状态改变时,Moel Locator 通过Data Binding方式来通知View改变。