Caringorm学习笔记


Caringorm学习笔记
Cairngorm事件驱动模型适合于处理业务逻辑,也公适合于处理业务逻辑,最好不要用它来处理界面行为

FController监听到Caringorm事件后,调用对应的Command
一个事件对应一个Command
分为6个部分
Business    业务逻辑部分 serviceLocator delegate
Command  命令部分     command
Control      控制部分        control event 
Model        数据模型部分  model
View         界面部分        view
VO            数据部分       vo
写作顺序:  vo model --view---command -- control (event)-回过头来把view中的逻辑实现了。最后写delegate和ServiceLocator  或者最开始的时候写,好和后端把数据连接调适好!

Business包括两部分内容: Delegate 和 ServiceLocator
ServiceLocator是用于调用远程服务的mxml,不用可以不写,但这里其实是Cairngom的强大优势
Delegate相当于一个代理,通过Command调用,它的工作是定位远程服务并且完成相应的服务调用,
Delegate是一个单例模式,我们一般用如下方式通过Delegate调用远程服务
private var remoteObject:RemoteObject = ServiceLocator.getInstance().getRemoteObject

countingService在ServiceLocator中通过如下方式定义:
<fx:Declaration>
<s:RemoteObject id="counting" destination =''countinService"/>
</fx:Declaration>

当然,我们也可以通过HttpService 和WebService 调用远程服务。
如此的话,在Delegate中的调用方法也会有变化的。
Cairngorm中提供了getRemoteObject() getHttpService() getWebService() 三种基本方法分别调用RemoteObject HttpService WebService三种远程调用机制

每一个定义的Delegate要具有如下的构造函数
public function CountDelegate(responder:IResponder):void{
      this.responder = responder;
}

Command 所有的后台函数调用都在Command部分完成。

所有的Command都实现了ICommand和IResponder接口IResponder接口定义了resulti()和fault()方法  。ICommand接口定义了一个excute()方法
其中excute() 函数声明一个Delegate变量,然后通过这个Delegate调用相应的方法, 
Command任务的实现实际上是通过Degate来实现的。command的result和fault一般是用来处理Delegate的返回信息
其中result是在处理成功时执行,一般是对Model(ModelLocator)进行处理
fault是在处理失败时候执行。我们用Command调用Delegate来执行远程服务,当Delegate执行完毕的时候,应当如何返回呢,Delegate应当如何定位是哪一个Command传来的执行信号呢,通过给Delegate传递一个IResponder变量(实际上这个变量就是Command自己),Delegate就可以在处理完成之后直接调用Command中的result方法,一般Delegate中有这么一句话。
responder.result(object); object 一般是要返回的值,或者服务相关信息。不会Caringorm学习笔记

Control 部分定义了三个基类,
CairngormEvent  在这里存储一些数据,把数据放入vo里,然后再放到event里
CairngormEventDispatcher 它是一个单例模式,它就是用来发送数据,CairngormEventDispatcher.getInstance().dispatchEvent(event)
FrontController 相当于一个控制中心,我们所发送的消息和执行的所有命令在这里都有记录。

FrontController 的构造函数一般只有一句话 this.addCommand(Event_NAME,Command);
它的任务就是监听所有的event,并且为它些消息指定相应的Command

前提是我们需要在界面中声明FrontController 
<fx:Declaration>
  <control:MyFrontControl/>
</fx:Declaration>

Model Model部分一般存放需要绑定在页面的数据
View 在这里一定要声明ServiceLocator 和 FrontControl
vo 简单点儿说,就是一个个的对象
总结:
1.View提供所有可视组件
2.FrontControl监听所有的Event
3.当用户操作引起Event发送时,View通过Cairngorm将Event发送到指定的Event中,这后Event在FrontControl接受处理
4.FontControl将Event发送到相应的Command 。Command调用相应的Delegate
5.Delegate完成远程调用,返回到Command
6.Command结果处理部分返回的信息。并且对Model部分做出修改。
7.Model部分的绑定数据被修改,View部分做出相应的变化。

要把Eclipse搞会,包括tomcat 数据库 服务器这一块
MetaData里[]号里面有很多东西,都会很有用。
Cairngorm 的实例 构造函数有两个值(type,vo);
一个功能块用一个FrontController 不会, 不确定
Command的excute()方法里面第一件要做的事,是判断事件的类型
Delegate的实例
在Services.mxml里面写上ServiceLocator 不会 不确定
ModuleLocator作用不明,不会
要让业务逻辑和界面挂钩,请用ViewHelper
顺序一  个人感觉不是很好
business里的service
model
view
control event
command
初始化control 

顺序二 
vo
modelLocator
view
event
view中触发事件
frontControl 映射
command
delegate


super我就一直没有搞明白!
command 实现了两个接口。 一个是Responder 一个ICommand  对么? 不会 不确定
ModelLocator要起一个独特的名字
instance 得是静态变量。
做第一个实验积累的经验:
1.代码永远要最简原则。
2.FrontController的子类,要放在app里,不用有实例名也可 在它里面只有一个 addCommand(Event,Command)
3.Delegate没有父类,在它的构造函数的参数里要有 rp:mx.rpc.IResponder 
4.Delegate时要有一个public 方法。供在Command里调用。
   处理获得的正确数据放到this.responder.result里面,错误的数据放到this.responder.fault里面。
5.RemoteService HttpService WebService 这些要配置在ServiceLocator里面 ,ServiceLocator 要在主场景声明。
6.关于Command三点:
   1.实现了cairngorm里面的ICommand 和mx里的IResponder
   2.所有有三个方法 excute result fault
   3 在excute里面  delegate(this)  delegate.publicFun
7.事件继承自CairngormEvent 且构造函数里要写上: 它有view这个属性。。
   super(AddBookEvent.ADD_BOOK_EVENT);
 this.bookVO = vo;.
8.ModelLocator不用有父类,这里面要写一个getInstance().
9.View里做两件事
   1. 把model和dp绑定
   2. 触发事件,要发出带vo的事件
10.vo 最关键的是注意起名!
11.所有的具体类最好都得实现某个,要根据接口编程
12.vo里最好不要有public的属性 要用getter setter 配合
13.vo为什么要绑定???
14.为了实现最后一步的ModelLocator数据和view绑定。可以这样:在view定义一个方法。当delegate返回值以后,执行view中的这个方法。
    即{目标值班=ModelLocator值)
15 和上面说的情况类似,如果要把view中对象的状态发生改变,也可以把ui放到Event里面。在Command里面,通过Event拿到ui,在command里可以直接对view进行控制,这个比上面的方法要好。
16.有些数据没有必要放到ModelLocator里的话,就直接在Command时实现逻辑(比如目标对象状态的改变)

亲自写一次之后的体会:
1.delegate里面的通信方法有很多种,这里面我自己写一个HttpServiceDelegate,要给它的构造函数按顺序传入iresponder,url,method默认为POST ,resultType默认为xml,requestVO 
2.要在delegate里面实例化一个HttpService 要给它赋值url method resultFormat request  .现以传进来的当作iresponder对象的Command做为listener. 对this.http做三个侦听!
3.TextVO的绑定我选择没有用。因为我也不太懂!不会 Caringorm学习笔记

常量命名的时候,尽量使用动作在前面的命名方式。
在从delegate获取了数据。把数据传给view的时候。这个例子的方法是在command里面加一个private变量。


posted @ 2011-12-31 11:05  jason_xiao  阅读(118)  评论(0编辑  收藏  举报