<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>houwei</title>
    <description></description>
    <link>http://houwei.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Flex 开发架构系列的源代码</title>
        <author>houwei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://houwei.javaeye.com">houwei</a>&nbsp;
          链接：<a href="http://houwei.javaeye.com/blog/224825" style="color:red;">http://houwei.javaeye.com/blog/224825</a>&nbsp;
          发表时间: 2008年08月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>写完这个系列blog后，接到一些朋友的站内消息，希望得到相关源代码。 因为修改每一篇blog，总发现会出现已有格式被破坏所以将所有源代码打包放在这里， 共有兴趣的朋友下载，所有项目文件都是建立在FlexBuilder3 下。清单如下：</p>
<p>&nbsp;</p>
<p>java：&nbsp; flexmvcRemoting</p>
<p>&nbsp;</p>
<p>Flex-all-in-one:&nbsp; FlexChaos</p>
<p>&nbsp;</p>
<p>Flex-Central Management:&nbsp; FlexCentralManagement</p>
<p>&nbsp;</p>
<p>Flex MVC-Cairngorm:&nbsp; FlexCairngorm</p>
<p>&nbsp;</p>
<p>Flex Cairngorm without frontcontroller:&nbsp;&nbsp; Flex_No_FC</p>
<p>&nbsp;</p>
<p>Flex Mate : Flex-Mate.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>任何问题，欢迎探讨。enjoy</p>
          <br/>
          <span style="color:red;">
            <a href="http://houwei.javaeye.com/blog/224825#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 06 Aug 2008 04:26:19 +0800</pubDate>
        <link>http://houwei.javaeye.com/blog/224825</link>
        <guid>http://houwei.javaeye.com/blog/224825</guid>
      </item>
      <item>
        <title>Flex 开发架构(五): Mate－基于标签的框架</title>
        <author>houwei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://houwei.javaeye.com">houwei</a>&nbsp;
          链接：<a href="http://houwei.javaeye.com/blog/224084" style="color:red;">http://houwei.javaeye.com/blog/224084</a>&nbsp;
          发表时间: 2008年08月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://mate.asfusion.com/"><span style="font-size: small; color: #800080; font-family: Times New Roman;"><img src="C:\\Documents and Settings\\niuy\\My Documents\\My Pictures\\mate_project_structure.JPG" alt="" />Mate</span></a><span style="font-size: small;"><span style="font-family: Times New Roman;"> </span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">将会成为</span><span style="font-family: Times New Roman;">Flex</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">领域的另一个热点。它使用设置（</span><span style="font-family: Times New Roman;">configuration</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）来调用</span><span style="font-family: Times New Roman;">Service</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，处理结果，同样也使用设置文件来更新绑定对象（</span><span style="font-family: Times New Roman;">Bindable object</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）。从某个角度来说：</span><span style="font-family: Times New Roman;">Mate</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">是</span><span style="font-family: Times New Roman;">Flex</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">领域的&ldquo;</span><span style="font-family: Times New Roman;">springframework</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&rdquo;。</span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small;"><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;; mso-fareast-font-family: SimSun; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA;">Mate</span><span style="font-size: 12pt; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">有两个架构层面的图表。一个是来自</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;; mso-fareast-font-family: SimSun; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA;"><a href="http://flexblog.faratasystems.com/">Yakov Fain of Farata Systems</a></span><span style="font-size: 12pt; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">，另一个来自</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;; mso-fareast-font-family: SimSun; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA;"><a href="http://mate.asfusion.com/"><span style="color: #800080;">ASFusion</span></a></span><span style="font-size: 12pt; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">。我更喜欢后者，其构架图如下：</span></span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small;"><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: 12pt; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';"><a href="http://mate.asfusion.com/assets/content/diagrams/two_way_view_injection.png">http://mate.asfusion.com/assets/content/diagrams/two_way_view_injection.png</a><img src="http://mate.asfusion.com/assets/content/diagrams/two_way_view_injection.png" height="629" alt="" width="594" /></span></span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small;">
<p><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: 12pt; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">
<p><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">来看看用</span><span style="font-family: Times New Roman;">Mate</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的编程方式来建立</span><span style="font-family: Times New Roman;">buddyList</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">应用程序。</span></p>
<p><span style="font-family: Times New Roman;">1</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，建立</span><span style="font-family: Times New Roman;">Mate</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的核心组件：</span><span style="font-family: Times New Roman;">EventMap</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。</span></p>
<p><span style="font-family: Times New Roman;">EventMap</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">是</span><span style="font-family: Times New Roman;">Mate</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的心脏，它黏着了所有的组件和控件。其代码如下：</span></p>
<p>BuddyListEventMap.mxml:</p>
<p>&nbsp;</p>
<pre name="code" class="xml">&lt;?xml version=”1.0″ encoding=”utf-8″?&gt;
  
&lt;EventMap xmlns=”http://mate.asfusion.com/” 
                             xmlns:mx=http://www.adobe.com/2006/mxml&gt;

&lt;/EventMap&gt;
</pre>
<p>&nbsp;</p>
<font size="3"><font face="SimSun" style="mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><font face="SimSun" style="font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">
<p>&nbsp;</p>
</font></font></font></span><font size="3"><font face="SimSun" style="mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p>&nbsp;</p>
</font></font></span></p>
<font size="3">
<p>&nbsp;</p>
</font></span>
<p>&nbsp;</p>
</p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt; color: #0000ff; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">其它内容稍后再填写，现在我们需要告诉主程序（</span><span style="font-size: 10pt; color: #0000ff;"><span style="font-family: Times New Roman;">Main Application</span></span><span style="font-size: 10pt; color: #0000ff; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）初始化</span><span style="font-size: 10pt; color: #0000ff;"><span style="font-family: Times New Roman;">EventMap</span></span><span style="font-size: 10pt; color: #0000ff; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：</span></p>
<p><span style="font-size: small; font-family: Times New Roman;"><span style="font-size: x-small; color: #0000ff; font-family: Simsun;">主程序 </span>Flex_Mate.mxml:</span></p>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;">
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Application  xmlns:map="com.ny.flex.mate.map.*" xmlns:views="com.ny.flex.mate.views.*" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"&gt;
&lt;mx:Script&gt;
	&lt;![CDATA[
		[Bindable]
		public var viewStackSelectedIndex :int = 0;
	]]&gt;
&lt;/mx:Script&gt;
<span style="color: #ff6600;"><strong><em>&lt;map:BuddyListEventMap/&gt;</em></strong></span>
    &lt;mx:HBox  horizontalAlign="center" verticalAlign="top"  width="100%" height="100%" y="0" x="0"&gt;
    &lt;mx:ViewStack id="viewStack"  resizeToContent="true" selectedIndex="{viewStackSelectedIndex}" &gt;
        &lt;views:LoginView  /&gt;
        &lt;views:BuddyListView/&gt;
    &lt;/mx:ViewStack&gt;
    &lt;/mx:HBox&gt;
&lt;/mx:Application&gt;
</pre>
<font size="3"><font face="Times New Roman">
<p>&nbsp;</p>
</font></font></span><font size="3">
<p>&nbsp;</p>
</font></span>
<p>&nbsp;</p>
</p>
<p>&nbsp;</p>
<p><span style="font-size: small;"></span></p>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;">2. </span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">建立</span><span style="font-family: Times New Roman;">LoginView :</span></span></p>
<p><span style="font-size: small; font-family: Times New Roman;">
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="300" height="200" horizontalAlign="center" verticalAlign="middle" title="Flex Cirngorm Login"&gt;
 &lt;mx:Script&gt;
	&lt;![CDATA[
		import com.ny.flex.mate.event.LoginEvent;
		import com.ny.flex.mate.vo.User;
		import mx.validators.Validator;
		private function login():void{
			if(Validator.validateAll(validators).length == 0){
				var loginUser:User = new User();
				loginUser.userName=username.text;
				loginUser.password=password.text;
				<span style="color: #ff6600;"><strong><em>var loginEvent:LoginEvent = new LoginEvent(LoginEvent.LOGIN);
				loginEvent.loginUser = loginUser;
				dispatchEvent(loginEvent);</em></strong></span>
			}   
		}
	]]&gt;
&lt;/mx:Script&gt;

 &lt;!--  Validators--&gt;
 &lt;mx:Array id="validators"&gt;
    &lt;mx:StringValidator  id="userNameValidator" source="{username}"  property="text"  required="true"/&gt;
    &lt;mx:StringValidator  id="passwordValidator" source="{password}"  property="text" required="true" /&gt;
 &lt;/mx:Array&gt;    


&lt;mx:Form id="loginForm" x="0" y="0"&gt;
          &lt;mx:FormItem label="Username:" &gt;
               &lt;mx:TextInput id="username" /&gt;
           &lt;/mx:FormItem&gt;
           &lt;mx:FormItem label="Password:" &gt;
               &lt;mx:TextInput id="password" displayAsPassword="true" /&gt;
           &lt;/mx:FormItem&gt;
           &lt;mx:FormItem direction="horizontal" verticalGap="15" paddingTop="5" width="170"&gt;
               &lt;mx:Button id="loginBtn" label="Login" click="login()"/&gt;
           &lt;/mx:FormItem&gt;
    &lt;/mx:Form&gt;
   	
&lt;/mx:Panel&gt;
</pre>
<font size="3" face="Times New Roman">
<p>&nbsp;</p>
</font></span>
<p>&nbsp;</p>
</p>
<p><span style="font-size: small;">从上面可以看出在方法login()中发送(dispatch)了LoginEvent, 来看看LoginEvent代码：</span></p>
<pre name="code" class="xml">package com.ny.flex.mate.event
{
	import com.ny.flex.mate.vo.User;
	
	import flash.events.Event;

	public class LoginEvent extends Event
	{
		public static const LOGIN:String = "login";
		public var  loginUser:User;
		public function LoginEvent(type:String, <span style="color: #ff6600;"><strong><em>bubbles:Boolean=true</em></strong></span>, cancelable:Boolean=false)
		{
			super(type, bubbles, cancelable);
		}
		
	}
}</pre>
<p>&nbsp;</p>
<p><span style="font-size: small;"><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在代码中&ldquo;</span><span style="font-family: Times New Roman;">bubbles</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&rdquo;属性必须为&ldquo;</span><span style="font-family: Times New Roman;">true</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&rdquo;，以使得上层的组件（</span><span style="font-family: Times New Roman;">EventMap）</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">可以处理它。</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;">Mate</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的魔法完全存在于</span><span style="font-family: Times New Roman;">EventMap</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中，</span><span style="font-family: Times New Roman;">LoginEvent在这里</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">被标签化处理：</span></span></p>
<p><span style="font-size: small;">
<p><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<pre name="code" class="xml">…..
 
&lt;EventHandlers type=”{LoginEvent.LOGIN}“&gt;
     &lt;RemoteObjectInvoker destination=”flexmvcRO” 
                                                method=”authenticate” 
                                                arguments=”{event.loginUser}“&gt;
 
         &lt;resultHandlers&gt;
               &lt;MethodInvoker generator=”{<span style="color: #ff6600;"><strong><em>LoginService</em></strong></span>}” 
                                         method=”<span style="color: #ff0000;"><strong><em>onResult_Authenticate</em></strong></span>” 
                                                    arguments=”{<span style="color: #800000;"><strong><em>resultObject</em></strong></span>}“/&gt;
        &lt;/resultHandlers&gt;
    &lt;/RemoteObjectInvoker&gt;
 &lt;/EventHandlers&gt;
……
</pre>
<p>&nbsp;&nbsp;</p>
</span></p>
</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p><span style="font-size: small;"><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">EvevntHandler</span></span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">代码中，用户可以定义</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">service</span></span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">函数（</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">RemoteObjectInvoker</span></span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">），同时也定义了结果处理的类、方法和参数。</span></span></p>
<p><span style="font-size: small;"><span lang="ZH-CN" style="font-size: 10pt; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">来看看</span><span style="font-size: 10pt;"><span style="font-family: Times New Roman;"> <span style="color: #ff6600;"><strong><em>LoginService.as</em></strong></span></span></span><span lang="ZH-CN" style="font-size: 10pt; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">代码：</span></span><span style="font-size: 10pt;"><span style="font-family: Times New Roman;">:</span></span></p>
<font face="SimSun" style="font-size: 10pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p>&nbsp;</p>
</font></span>
<p>&nbsp;</p>
</p>
<pre name="code" class="xml">package com.ny.flex.mate.service
{
	import com.ny.flex.mate.vo.User;
	
	public class <span style="color: #ff6600;"><strong><em>LoginService</em></strong></span>
	{
		[Bindable]
		public var authUserName:String;
		[Bindable]
		public var viewStackSelectedIndex:int ;

		public function  <span style="color: #ff0000;"><strong><em>onResult_Authenticate</em></strong></span>(<span style="color: #800000;"><strong><em>user:User</em></strong></span>):void{
			authUserName = user.userName;
			viewStackSelectedIndex = 1;
		}
		
	}
}</pre>
<p>&nbsp;</p>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;">Service</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">类处理结果，返回绑定的对象。然后我们就需要更新目标视窗。</span></span></p>
<p><span style="font-size: small;"></span></p>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;">Mate</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">另一个闪光点就是注射（</span><span style="font-family: Times New Roman;">Injecting</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）可绑定的对象到目标视窗！用户只需要在</span><span style="font-family: Times New Roman;">EventMap</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">类中增加另一个标签Injector。（Coolest 部分）：</span></span></p>
<p><span style="font-size: small;"></span></p>
<p>&nbsp;</p>
<pre name="code" class="xml">&lt;Injectors target=”{BuddyListView}“&gt;
           &lt;PropertyInjector targetKey=”authUserName”     
                                        source=”{LoginService}” 
                                        sourceKey=”authUserName“/&gt;
 
 &lt;/Injectors&gt;
 
&lt;Injectors target=”{Flex_Mate}“&gt;
              &lt;PropertyInjector targetKey=”viewStackSelectedIndex” 
                               source=”{LoginService}”
                               sourceKey=”viewStackSelectedIndex“/&gt;
 
 &lt;/Injectors&gt;
 
 
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: small;"><span style="font-size: 10pt; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在此定义目标视窗、目标关键词，资源服务对象和资源关键词。</span><span lang="ZH-CN" style="font-size: 10pt;"><span style="font-family: Times New Roman;"> 你根本不需要写任何glue code。</span></span></span></p>
<p><span lang="ZH-CN" style="font-size: 10pt;"></span></p>
<p><span style="font-size: small;"><span style="font-size: 10pt; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">最后定义目标视窗：</span><span style="font-family: Times New Roman;"><span lang="ZH-CN" style="font-size: 10pt;"> </span><span style="font-size: 10pt;">BuddyListView.mxml：</span></span></span></p>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;"><span style="font-size: 10pt;">
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" title="Buddy List of  {authUserName}" creationComplete="getBuddyList()" width="500" height="320"&gt;
&lt;mx:Script&gt;
	&lt;![CDATA[
		import mx.collections.ArrayCollection;
		import com.ny.flex.mate.event.GetBuddyListEvent;
	   [Bindable]
	   public var authUserName:String;
	   [Bindable]
	   public var buddyCollection:ArrayCollection;
	   
	   private function getBuddyList():void{
			var getBuddyListEvent:GetBuddyListEvent = new GetBuddyListEvent(GetBuddyListEvent.GET_BUDDY_LIST);
			getBuddyListEvent.authUserName = authUserName;
			dispatchEvent(getBuddyListEvent);
		}
	]]&gt;
&lt;/mx:Script&gt;

 &lt;mx:DataGrid id="buddyList"  dataProvider="{buddyCollection}"  borderStyle="none" width="100%" height="100%" &gt;
       &lt;mx:columns&gt;
        &lt;mx:DataGridColumn dataField="firstName" headerText="First Name"/&gt;
        &lt;mx:DataGridColumn dataField="lastName" headerText="Last Name"/&gt;
    &lt;/mx:columns&gt;

 &lt;/mx:DataGrid&gt;
&lt;/mx:Panel&gt;
</pre>
<p>&nbsp;</p>
</span></span><font size="3">
<p>&nbsp;</p>
</font></span>
<p>&nbsp;</p>
</p>
<p>&nbsp;</p>
<p><span style="font-family: Times New Roman;">
<p><span style="font-size: 10pt;">
<p>&nbsp;</p>
<p>整个开发流程是这样的：</p>
<p>&nbsp;</p>
</span></p>
</span></p>
<p>&nbsp;</p>
<p><span style="font-size: small; font-family: Times New Roman;">Action&ndash;&gt;Dispatch Event&ndash;&gt;Config Handler&ndash;&gt;create service&ndash;&gt;Inject Bindable Object &ndash;&gt;another Action&hellip;.</span></p>
<p>&nbsp;</p>
<p><span style="font-size: small; font-family: Times New Roman;">整个项目结构图 见附件</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"></span></p>
<p><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">总结：</span></span></p>
<p><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"></span></p>
<p><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在我</span><span style="font-family: Times New Roman;">5</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">篇</span><span style="font-family: Times New Roman;">blog</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中讨论过的</span><span style="font-family: Times New Roman;">Flex</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">编程框架中，哪一个是最好的呢？</span></span></p>
<p><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">我认为中央管理（</span><span style="font-family: Times New Roman;">central management</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）最适合进阶水准的小型项目。因为无须学习新的框架，并且也一样有清晰的架构。 而且 他也是走向框架的起点。</span></span></p>
<p><span style="font-size: small;"></span></p>
<p><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对于</span><span style="font-family: Times New Roman;">Mate</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和</span><span style="font-family: Times New Roman;">Cairngorm</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，在我看来</span><span style="font-family: Times New Roman;">Mate</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">略占上风，原因如下：</span></span></p>
<p><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对于</span><span style="font-family: Times New Roman;">Cairngorm</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;">1</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，</span><span style="font-family: Times New Roman;">Cairngorm</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">过于复杂，学习曲线较高</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;">2</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，我觉得</span><span style="font-family: Times New Roman;">Cairngorm</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">有一些垃圾代码（例如</span><span style="font-family: Times New Roman;">Frontcontroller，event 和Command</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）。</span></span></p>
<p><span style="font-size: small;"></span></p>
<p><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对于</span><span style="font-family: Times New Roman;">Mate</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;">1</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，比</span><span style="font-family: Times New Roman;">Cairngorm</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">更简单易学，貌似继承和发扬了Flex的特质。</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;">2</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，从</span><span style="font-family: Times New Roman;">EventMap</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中得益，因为无须编写在事件和服务之间的黏着代码。</span></span></p>
<p><span style="font-size: small;"></span></p>
<p><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">但另一个方面，</span><span style="font-family: Times New Roman;"> EventMap</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">也会带来痛苦，试想一下，用户有</span><span style="font-family: Times New Roman;">50</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">个行为和</span><span style="font-family: Times New Roman;">100</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">个对象需要绑定，那就需要在</span><span style="font-family: Times New Roman;">EventMap</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中写入大量的</span><span style="font-family: Times New Roman;">configration</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">代码。那么</span><span style="font-family: Times New Roman;">EventMap</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">就成为一个灾难。</span></span></p>
<p><span style="font-size: small;"></span></p>
<p><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">因此，如果用户使用</span><span style="font-family: Times New Roman;">Cairngorm</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，就可以选用</span><span style="font-family: Times New Roman;">&nbsp;</span></span><a href="http://yongniu.wordpress.com/2008/07/28/cut-it-off-cairngorm-without-front-controller/"><span style="font-size: small; font-family: Times New Roman;"> Cairngorm without FrontContoller</span></a><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">的方案。</span></span></p>
<p><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"></span></p>
<p><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对于</span><span style="font-family: Times New Roman;">Mate</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，如果使用</span><span style="font-family: Times New Roman;">Meta</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">标签来代替</span><span style="font-family: Times New Roman;">EventMap</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，就无须设置太多的东西，示例如下：</span></span></p>
<p><span style="font-size: small; font-family: Times New Roman;">[EventHadler ={name ="myHandler", serviceclass="myservice" result&nbsp;, taget ...}]</span></p>
<p><span style="font-size: small; font-family: Times New Roman;">MateDispatch(myevent).</span></p>
<p>&nbsp;</p>
<p><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">我在期待着它的来临。</span></span></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://houwei.javaeye.com/blog/224084#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 05 Aug 2008 06:28:57 +0800</pubDate>
        <link>http://houwei.javaeye.com/blog/224084</link>
        <guid>http://houwei.javaeye.com/blog/224084</guid>
      </item>
      <item>
        <title>Flex 开发架构(四): 去除FrontController 的Cairngorm</title>
        <author>houwei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://houwei.javaeye.com">houwei</a>&nbsp;
          链接：<a href="http://houwei.javaeye.com/blog/223520" style="color:red;">http://houwei.javaeye.com/blog/223520</a>&nbsp;
          发表时间: 2008年08月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">正如在使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">Cairngorm</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">时，视图中的每一个动作都播送一个事件，每个播送出去的事件都需要建立相应的命令代码来处理事件。并且需要在</span><span lang="EN-US"><span style="font-family: Times New Roman;">FrontController</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中对应他们的关系。例如下面的简单流程：</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: Times New Roman;"><strong><span lang="EN-US">Loginvew.xml &mdash;&gt; action login() &mdash;&gt;dispatch LoginEvent &mdash;&gt;Handled by LoginCommand &mdash;&gt;mapping LoginEvent and LoginCommand in FrontController</span></strong><span lang="EN-US">.</span></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在不考虑商务层代码的情况下，当用户建立然后新的动作时，就需要建立</span><span lang="EN-US"><span style="font-family: Times New Roman;">2</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">个新的代码，修改</span><span lang="EN-US"><span style="font-family: Times New Roman;">Controller</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">代码。</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">那么如何简化</span><span lang="EN-US"><span style="font-family: Times New Roman;">Cairngorm</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，我的方法是去掉</span><span lang="EN-US"><span style="font-family: Times New Roman;">FrontController</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，取而代之的是</span><span lang="EN-US"><span style="font-family: Times New Roman;">Service Fa&ccedil;ade</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，其框架图如下所示：<img src="http://yongniu.files.wordpress.com/2008/07/cairngormwocontroller.png" height="442" alt="" width="769" /></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在上图中，视图不再播送如何事件，而是直接调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">Service Fa&ccedil;ade</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。而</span><span lang="EN-US"><span style="font-family: Times New Roman;">Service Fa&ccedil;ade</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">则直接调用商务委托层与服务器端通讯（如</span><span lang="EN-US"><span style="font-family: Times New Roman;">Remote Object</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">等），然后商务委托处理结果并更新</span><span lang="EN-US"><span style="font-family: Times New Roman;">Model Locator</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，最后</span><span lang="EN-US"><span style="font-family: Times New Roman;">Model Locator</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">通过绑定（</span><span lang="EN-US"><span style="font-family: Times New Roman;">Binding</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）更新视窗中的结果。</span><span lang="EN-US"><span style="font-family: Times New Roman;"> </span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">看一下被改变的代码：</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">ServiceFacade.as:</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<pre name="code" class="xml">package com.ny.flex.cairngorm.no_fc.service
{
	import com.ny.flex.cairngorm.no_fc.vo.User;
	
	public class ServiceFacade
	{
		private static var _serviceFacade:ServiceFacade = null;
		
		public function ServiceFacade(privateClass:PrivateClass)
		{
			if(ServiceFacade._serviceFacade == null){
				ServiceFacade._serviceFacade = this;
			}
		}
		public static function getInstance():ServiceFacade {
			if(_serviceFacade == null){
				_serviceFacade = new ServiceFacade(new PrivateClass);
			}
			return _serviceFacade;
		}
		
		public function authenticate(user:User):void{
			LoginDelegate.getInstance().authenticate(user);
		}
		public function  getBuddyList():void{
			BuddyListDelegate.getInstance().getBuddyList();
		}
	}
}

class  PrivateClass{}</pre>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: 10pt; color: #000000;"><span style="font-family: Times New Roman;">ServiceFacade</span></span><span style="font-size: 10pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">提供了对所有商务逻辑为一体的界面，视窗的行为(Action)仅仅调用</span><span style="font-size: 10pt; color: #000000;"><span style="font-family: Times New Roman;">fa&ccedil;ade</span></span><span style="font-size: 10pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，例如下面代码中的</span><span style="font-size: 10pt; color: #000000;"><span style="font-family: Times New Roman;">Login</span></span><span style="font-size: 10pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的动作。</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: 10pt; color: #000000; font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">Loginvew.xml </span><span style="font-size: 10pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">：</span></p>
</p>
<p><span style="font-size: 10pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<pre name="code" class="xml">	private function login():void{
			if(Validator.validateAll(validators).length == 0){
				var loginUser:User = new User();
				loginUser.userName=username.text;
				loginUser.password=password.text;
				<span style="color: #ff6600;"><strong><em>serviceFacade.authenticate(loginUser);</em></strong></span>
			}   
		}
</pre>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">函数</span><span style="font-family: Times New Roman;"> </span></span><em><strong><span style="font-size: 10pt; color: #000000;"><span style="font-family: Times New Roman;">serviceFacade.authenticate(loginUser)</span></span></strong></em><em><span style="font-size: 10pt; color: #000000; font-style: normal; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-weight: bold; mso-bidi-font-style: italic;">如下</span></em><em><strong><span style="font-size: 10pt; color: #000000;"><span style="font-family: Times New Roman;">:</span></span></strong></em></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><em><strong></strong></em>&nbsp;</p>
</p>
<pre name="code" class="xml">		public function authenticate(user:User):void{
			<span style="color: #ff6600;"><strong><em>LoginDelegate.</em></strong></span>getInstance().authenticate(user);
		}
</pre>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;</p>
</span></p>
<font face="宋体" style="mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: 10pt; color: #000000; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;"><strong><em><span style="font-family: Times New Roman;">ServiceFacade</span></em></strong></span><span>使用<span style="font-family: Times New Roman;"><strong><em>LoginDelegate</em></strong> 来真正实现Business Logic：</span></span></p>
</span></p>
</span></p>
</font></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;LoginDelegate.as:</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</p>
<pre name="code" class="xml">package com.ny.flex.cairngorm.no_fc.service
{
	import com.ny.flex.cairngorm.no_fc.*;
	import com.ny.flex.cairngorm.no_fc.vo.User;
	
	import mx.rpc.IResponder;
	import mx.rpc.Responder;
	import mx.rpc.events.ResultEvent;
	
	public class LoginDelegate extends BaseDelegate 
	{
		private static  var _loginDelegate:LoginDelegate = null;
		
		public function LoginDelegate(privateClass:PrivateClass){
			if(LoginDelegate._loginDelegate == null ){
				LoginDelegate._loginDelegate = this;
			}
		
		}
		
		public  static function  getInstance():LoginDelegate{
			if(_loginDelegate == null){
				_loginDelegate = new LoginDelegate(new PrivateClass);
			}
			return  _loginDelegate;
		}
		
		public function <span style="color: #ff6600;"><strong><em> authenticate</em></strong></span>(user:User):void{
			var responder:IResponder = new Responder(onResult_Authenticate,fault);
			var call:Object = service.authenticate(user);
			call.addResponder(responder);
		}
		
		private function onResult_Authenticate(event:ResultEvent):void{
			var authUser:User = event.result as User;
			model.loginUser = authUser;
			model.viewStackSelectedIndex = 1;
		}
	
	}
}

class PrivateClass{}</pre>
<p>&nbsp;&nbsp;</p>
<font size="3"><font face="宋体" style="mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span>上面的<span style="font-family: Times New Roman;"><strong><em>authenticate(user)</em></strong> 实现于后台通讯并</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">处理结果，更新</span><span style="color: #000000;"><span style="font-family: Times New Roman;">Model Locator</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。</span><span style="font-size: 10pt; color: #000000;"><span style="font-family: Times New Roman;"> </span></span></p>
<p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">其他的视图和相应的处理方法 与上面类似。</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">这个解决方案简化了</span><span style="font-size: 10pt; color: #000000;"><span style="font-family: Times New Roman;">Cairngorm</span></span><span style="font-size: 10pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的框架，使得代码更易于理解。而且，彻底摆脱了 无味的dispatcher,frontcontroller 和command。 编码效率会提高 并且易于调试。 </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">但其弱点是显而易见的：它违犯了解耦的（就是使得设计程序耦合性尽可能的降低）设计规范，使得界面上的行为（Action）和</span><span style="font-size: 10pt; color: #000000;"><span style="font-family: Times New Roman;">Serivce Fa&ccedil;ade</span></span><span style="font-size: 10pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">产生了耦合关系。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; color: #000000;">在最后一篇中我将讨论下一个Flex 开发的热点：Mate－标签化的框架。</span></p>
</p>
</font></font></span><font size="3">
<p>&nbsp;</p>
</font></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://houwei.javaeye.com/blog/223520#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 03 Aug 2008 02:55:24 +0800</pubDate>
        <link>http://houwei.javaeye.com/blog/223520</link>
        <guid>http://houwei.javaeye.com/blog/223520</guid>
      </item>
      <item>
        <title>Flex 开发架构(三): MVC框架－Flex Cairngorm</title>
        <author>houwei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://houwei.javaeye.com">houwei</a>&nbsp;
          链接：<a href="http://houwei.javaeye.com/blog/220853" style="color:red;">http://houwei.javaeye.com/blog/220853</a>&nbsp;
          发表时间: 2008年07月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small;"><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">有没有听说过这个奇怪的词汇：&ldquo;</span><span style="font-family: Times New Roman;">Cairngorm</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&rdquo;？</span><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: SimSun; mso-ansi-language: ZH-CN; mso-fareast-language: EN-US;">如果你的回答是</span><span style="font-family: Times New Roman;"><span lang="ZH-CN" style="mso-ascii-font-family: SimSun; mso-bidi-font-family: SimSun; mso-ansi-language: ZH-CN; mso-fareast-language: EN-US">&ldquo;</span><span style="mso-fareast-language: EN-US">No</span><span lang="ZH-CN" style="mso-ascii-font-family: SimSun; mso-bidi-font-family: SimSun; mso-ansi-language: ZH-CN; mso-fareast-language: EN-US">&rdquo;</span></span><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: SimSun; mso-ansi-language: ZH-CN; mso-fareast-language: EN-US;"> &amp;&amp; </span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">你是</span><span style="font-family: Times New Roman;">Flex</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">程序员，哪你就看看自己是不是住在一个井底。</span><span style="font-family: Wingdings;">J</span><span style="font-family: Times New Roman;">&nbsp; </span></span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small;"><span style="font-family: Times New Roman;">Cairngorm</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">是</span><span style="font-family: Times New Roman;">Flex</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的一个</span><span style="font-family: Times New Roman;">MVC</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">框架结构，名字取自苏格兰的一个山脉。（</span><span style="font-family: Times New Roman;">kao</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，如果是我建立一个自己的框架结构，我就取名叫：&ldquo;天安门&rdquo;。）</span></span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">有关这个框架，在网络上有很多图表用来讨论。下面是我所理解的框架图表：</span></span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><img src="http://yongniu.files.wordpress.com/2008/07/cairngorm.png" height="721" alt="" width="673" /></span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">&nbsp;</p>
<p><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small;"><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">使用</span><span style="font-family: Times New Roman;">Cairngorm</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的第一步是建立框架结构的骨架，包括了三个对象：</span></span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small;"><strong><span style="font-family: Times New Roman;">Model Locater</span></strong><strong><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">；</span></strong></span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small;"><strong><span style="font-family: Times New Roman;">Service Locator</span></strong><strong><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">；</span></strong></span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small;"><strong><span style="font-family: Times New Roman;">Front Controller</span></strong><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">；</span></span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small;"><span style="font-family: Times New Roman;">Model Locator</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：承载了组件之间的所有的传递的信息和数据，这是一个</span><span style="font-family: Times New Roman;">Bindable</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">（可绑定的）对象。</span></span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small;"><span style="font-family: Times New Roman;">Service Locator</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：定义了与数据源（</span><span style="font-family: Times New Roman;">Httpservice</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，</span><span style="font-family: Times New Roman;">Webservice</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，</span><span style="font-family: Times New Roman;">Remoteobject</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）之间通讯的界面。</span></span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small;"><span style="font-family: Times New Roman;">Front Controller</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：建立播送事件（</span><span style="font-family: Times New Roman;">Dispatch event</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）和命令层（</span><span style="font-family: Times New Roman;">command</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）之间的对应关系（</span><span style="font-family: Times New Roman;">mapping</span><span style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）。</span><span style="font-family: Times New Roman;">&nbsp;&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="font-size: 12pt; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">看一下相关的代码：</span></p>
<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><em><span style="font-family: Times New Roman;"><strong><span style="font-size: 10pt; color: black;">BuddyAppModelLocator</span><span style="font-size: small;">.as:</span></strong></span></em></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><em></em></p>
<pre name="code" class="xml">package com.ny.flex.cairngorm.model
{
      import com.ny.flex.cairngorm.vo.User;
      
      import mx.collections.ArrayCollection;
      
      [Bindable]
      public class BuddyAppModelLocator
      {
            public var buddyList:ArrayCollection=new ArrayCollection();
            public var loginUser:User=new User();
            public var viewStackSelectedIndex :int = 0;
            
            static private var __instance:BuddyAppModelLocator=null;
            
            static public function getInstance():BuddyAppModelLocator
            {
                  if(__instance == null)
                  {
                        __instance=new BuddyAppModelLocator();
                  }
                  return __instance;
            }
      }
}
</pre>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在</span><span style="font-family: Times New Roman;">Model Locator</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">代码中，定义了三个</span><span style="font-family: Times New Roman;">public</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的变量，</span><span style="font-family: Times New Roman;">buddyList</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：用来存放由数据库获取的密友列表；</span><span style="font-family: Times New Roman;">loginUser</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：定义一个</span><span style="font-family: Times New Roman;">User</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">类型对象；</span><span style="font-family: Times New Roman;">viewStackSelectedIndex</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：定义</span><span style="font-family: Times New Roman;">viewStack</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">指向的视窗。</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">几乎所有的服务层返回的信息都需要在</span><span style="font-family: Times New Roman;">Model Locator</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中有一个相应的对象。</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><em><span style="font-size: small; font-family: Times New Roman;"><strong>BuddyServiceLocator.mxml:</strong></span></em></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><strong><em></em></strong></p>
<pre name="code" class="xml">&lt;?xml version=”1.0″ encoding=”utf-8″?&gt;
&lt;cairngorm:ServiceLocator xmlns:mx=”http://www.adobe.com/2006/mxml” xmlns:cairngorm=”http://www.adobe.com/2006/cairngorm“&gt;
      &lt;mx:RemoteObject id=”buddyRo“  destination=”flexmvcRO” &gt;
            
      &lt;/mx:RemoteObject&gt;
&lt;/cairngorm:ServiceLocator&gt;
</pre>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: 10pt;"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">上述代码定义了程序将要调用的</span></span><a name="OLE_LINK1"><span style="font-size: 10pt; color: black;"><span style="font-size: small; font-family: Times New Roman;">RemoteObject&nbsp;</span></span></a><span style="font-size: small;"><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">RemoteObject&nbsp;</span></span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">所调用的</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">Destination</span></span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">需要和</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">remote_config.xml</span></span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">文件中的</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">Destination</span></span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">相一致。在此，</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">Destination</span></span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的值为&ldquo;</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">flexmvcRO</span></span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&rdquo;。</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"></span></p>
<p><span style="font-size: small; font-family: Times New Roman;"><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><em><span style="font-size: 10pt;"><strong>BuddyListController.as:</strong></span></em></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><em><span style="font-size: 10pt;"><strong></strong></span></em></p>
</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: 10pt;"><span style="font-family: Times New Roman;">&nbsp;
<pre name="code" class="xml">package com.ny.flex.cairngorm.control
{
      import com.adobe.cairngorm.control.FrontController;
      import com.ny.flex.cairngorm.command.GetBuddyListCommand;
      import com.ny.flex.cairngorm.command.LoginCommand;
      import com.ny.flex.cairngorm.event.GetBuddyListEvent;
      import com.ny.flex.cairngorm.event.LoginEvent;
 
      public class BuddyListController extends FrontController
      {
            public function BuddyListController()
            {
                  super();
                  addCommand(LoginEvent.LOGIN_EVENT,LoginCommand);      
                  addCommand(GetBuddyListEvent.GET_BUDDY_LIST_EVENT,
GetBuddyListCommand);
            }
            
      }
}
</pre>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">很显然，上述的</span>Controller<span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">代码是事件和命令的对应处理的地方。</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">如何能将这些乱七八糟的东西结合在一起？其Magic的地方是在主页（</span>Main application<span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）上，代码如下：</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><em><span style="font-size: small;"><strong>BuddList_Main_Cairngorm.mxml:</strong></span></em></p>
<p><span style="font-size: 10pt; color: black;">
<pre name="code" class="xml">&lt;?xml version=”1.0″ encoding=”utf-8″?&gt;
&lt;mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml“  xmlns:service=”com.ny.flex.cairngorm.service.*“  xmlns:controller=”com.ny.flex.cairngorm.control.*” xmlns:views=”com.ny.flex.cairngorm.views.*” layout=”absolute“  width=”100%” height=”100%“&gt;
&lt;mx:Script&gt;
      &lt;![CDATA[
            import com.ny.flex.cairngorm.model.BuddyAppModelLocator;
      [Bindable]
      public var myModel:BuddyAppModelLocator = BuddyAppModelLocator.getInstance();
      ]]&gt;
&lt;/mx:Script&gt;
 
      &lt;service:BuddyServiceLocator id=”myservice“/&gt;
      &lt;controller:BuddyListController id=”myController“/&gt;
 
    &lt;mx:HBox  horizontalAlign=”center” verticalAlign=”top“  width=”100%” height=”100%” y=”0” x=”0“&gt;
    &lt;mx:ViewStack id=”viewStack“  resizeToContent=”true” selectedIndex=”{myModel.viewStackSelectedIndex}” &gt;
        &lt;views:LoginView  /&gt;
        &lt;views:BuddyListView/&gt;
    &lt;/mx:ViewStack&gt;
    &lt;/mx:HBox&gt;
&lt;/mx:Application&gt;
</pre>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">现在用户可以建立视图组件，并从这些组件中播送事件:</span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><em><span style="font-size: 10pt; color: black;"><strong>LoginView.mxml:</strong></span></em></p>
</span>
<p><span style="font-size: 10pt; color: black;">
<pre name="code" class="xml"><em>      &lt;![CDATA[
            import com.ny.flex.cairngorm.event.LoginEvent;
            import com.ny.flex.cairngorm.vo.User;
            import mx.validators.Validator;
            private function login():void{
                  if(Validator.validateAll(validators).length == 0){
                        var loginUser:User = new User();
                        loginUser.userName=username.text;
                        loginUser.password=password.text;
                        var loginEvent:LoginEvent = new LoginEvent();
                        loginEvent.loginUser = loginUser;
                        loginEvent.dispatch();
                  }   
            }
      ]]&gt;
&lt;/mx:Script&gt;
 
 &lt;!–  Validators–&gt;
 &lt;mx:Array id=”validators“&gt;
    &lt;mx:StringValidator  id=”userNameValidator” source=”{username}“  property=”text“  required=”true“/&gt;
    &lt;mx:StringValidator  id=”passwordValidator” source=”{password}“  property=”text” required=”true” /&gt;
 &lt;/mx:Array&gt;    
 
 
&lt;mx:Form id=”loginForm” x=”0” y=”0“&gt;
          &lt;mx:FormItem label=”Username:” &gt;
               &lt;mx:TextInput id=”username” /&gt;
           &lt;/mx:FormItem&gt;
           &lt;mx:FormItem label=”Password:” &gt;
               &lt;mx:TextInput id=”password” displayAsPassword=”true” /&gt;
           &lt;/mx:FormItem&gt;
           &lt;mx:FormItem direction=”horizontal” verticalGap=”15” paddingTop=”5” width=”170“&gt;
               &lt;mx:Button id=”loginBtn” label=”Login” click=”login()”/&gt;
           &lt;/mx:FormItem&gt;
    &lt;/mx:Form&gt;
      
&lt;/mx:Panel&gt;
</em></pre>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><em>&nbsp;</em></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span lang="ZH-CN" style="font-size: 10pt; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">每一个动作都需要建立一个相应的事件：</span><span style="font-size: 10pt;"></span></p>
</span></p>
<span style="font-size: 10pt; color: black;">
<p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><em><span style="font-size: 10pt;"><strong>LoginEvent.as:</strong></span></em></p>
<p><span style="font-size: 10pt;">
<pre name="code" class="xml"><em>package com.ny.flex.cairngorm.event
{
      import com.adobe.cairngorm.control.CairngormEvent;
      import com.ny.flex.cairngorm.vo.User;
      
      import flash.events.Event;
 
      public class LoginEvent extends CairngormEvent
      {
            public static var LOGIN_EVENT:String = “loginEvent”
            public  var  loginUser:User ;
            
            public function LoginEvent()
            {
                  super(LOGIN_EVENT);
            }
 
            override public function clone() : Event
            {
                  return new LoginEvent();
            }
      }
}
</em></pre>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><em>&nbsp;</em></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">每一个事件都</span><span lang="ZH-CN" style="font-size: 10pt; color: black;"> </span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">要对应于一个命令：</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: 10pt; color: black;"><em><strong>LoginCommand.as:</strong></em></span></p>
</span>
<p><span style="font-size: 10pt; color: black;">
<pre name="code" class="xml">package com.ny.flex.cairngorm.command
{
      import com.adobe.cairngorm.commands.ICommand;
      import com.adobe.cairngorm.control.CairngormEvent;
      import com.ny.flex.cairngorm.event.LoginEvent;
      import com.ny.flex.cairngorm.model.BuddyAppModelLocator;
      import com.ny.flex.cairngorm.service.LoginDelegate;
      import com.ny.flex.cairngorm.vo.User;
      
      import mx.controls.Alert;
      import mx.rpc.IResponder;
 
      public class LoginCommand implements ICommand, IResponder
      {
            public function LoginCommand()
            {
            }
 
            public function execute(event:CairngormEvent):void
            {
                  var loginEvent:LoginEvent = LoginEvent(event);
                  var user:User = loginEvent.loginUser;
                  var lgoinService :LoginDelegate 
=  new LoginDelegate(this);
                  lgoinService.authenticate(user);
            }
            
            public function result(event:Object):void
            {
                  var authUser:User = User(event.result);
                  BuddyAppModelLocator.getInstance().loginUser = authUser;
                  BuddyAppModelLocator.getInstance().viewStackSelectedIndex=1;
            }
            
            public function fault(info:Object):void
            {
                  Alert.show(“Login Fail Error “);
            }
            
      }
}
</pre>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
</span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<span style="font-size: 10pt;">
<p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">然后，在</span><span style="font-size: 10pt; color: black;">Front Controller</span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">（前端控制器）中</span><span style="font-size: 10pt; color: black;">build</span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对应关系：</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;">&nbsp;<em><strong><span style="font-size: 10pt; color: black;">addCommand(LoginEvent.LOGIN_EVENT,LoginCommand);</span></strong></em></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: 10pt; color: black;"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">命令层需要完成商务逻辑，用户需要在执行方法中加入商务逻辑代码：</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: 10pt; color: black;">&nbsp;</span>
<pre name="code" class="xml">                  var lgoinService :LoginDelegate =  
                                            new LoginDelegate(this);
                  lgoinService.authenticate(user);
</pre>
<span style="font-size: 10pt; color: black;">
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"><span style="font-size: 10pt; color: black;">Delegate</span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">（代表）用来通过服务层（</span><span style="font-size: 10pt; color: black;">Service Locator</span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）调用数据源：</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: 10pt; color: black;"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><em><span style="font-size: 10pt; color: black;"><span style="font-size: small;"><strong>LoginDelegate.as:</strong></span></span></em></p>
<p><em><span style="font-size: 10pt; color: black;">
<pre name="code" class="xml">package com.ny.flex.cairngorm.service
{
      import com.adobe.cairngorm.business.ServiceLocator;
      import com.ny.flex.cairngorm.vo.User;
      
      import mx.rpc.IResponder;
      
      public class LoginDelegate
      {
            private var responder:IResponder;
            private var service:Object;
            
            public function LoginDelegate(responder :IResponder){
              this.service = 
                           ServiceLocator.getInstance()
                                        .getRemoteObject(“buddyRo”);
              this.responder = responder;
            }
            
            public function  authenticate(user:User):void{
                  var call:Object = service.authenticate(user);
                  call.addResponder(responder);
            }
      }
}
 
</pre>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
</span></em></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">返回的结果将回复到命令层(LoginCommand.as)的结果方法中，在此方法中</span>Model<span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">被更新，然后数据被绑定到结果视图上：</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><strong><em>LoginCommand.as:</em></strong></span></span></p>
<p><span style="font-size: small;"><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<pre name="code" class="xml">            public function result(event:Object):void
            {
                  var authUser:User = User(event.result);
                  BuddyAppModelLocator.getInstance().loginUser
                                                                                    = authUser;
                        BuddyAppModelLocator.getInstance().viewStackSelectedIndex=1;
            }
</pre>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
</span></span>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">其它的视图工作流程同上，整个密友列表项目的结构如下图所示：</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><img src="http://yongniu.files.wordpress.com/2008/07/buddycairngorm.png" alt="" /></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"></span></p>
<p><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">使用</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">Cairngorm</span></span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">开发应用项目</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">Layer</span></span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，测试性高。并且使得程序员更专业化。</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">&nbsp;</span></span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">但这个框架的确很不容易学习和维护，那么有没有更好的方法简化它？</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">&nbsp;</span></span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: 10pt; color: black;"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;"><span style="font-size: small;"><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">来看看：咔嚓</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">Front Controller</span></span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的</span><span style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;">Cairngorm</span></span><span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。</span><span lang="ZH-CN" style="font-size: 10pt; color: black;"><span style="font-family: Times New Roman;"> </span></span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
</span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
</span></p>
</span></p>
</span></p>
</span></span></p>
</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://houwei.javaeye.com/blog/220853#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Jul 2008 02:24:50 +0800</pubDate>
        <link>http://houwei.javaeye.com/blog/220853</link>
        <guid>http://houwei.javaeye.com/blog/220853</guid>
      </item>
      <item>
        <title>Flex 开发架构(二): 中央管理－Flex Central Managerment</title>
        <author>houwei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://houwei.javaeye.com">houwei</a>&nbsp;
          链接：<a href="http://houwei.javaeye.com/blog/219666" style="color:red;">http://houwei.javaeye.com/blog/219666</a>&nbsp;
          发表时间: 2008年07月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a name="_Toc103311832"></a><a name="_Toc96352983"></a><a name="_Toc96098685"></a><a name="_Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">
<p><span style="font-size: small;">&nbsp;</span></p>
</span></span></span></span></a><a href="../../blog/219304"><span style="color: #800080;"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832">Flex Chaos-All-in-one</span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"></span></span></span></span></span></a><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">这一节中所提到的，在大型项目中，将所有的代码放在一起并非明智之举，确切的讲：正确的方法是将商业逻辑层与</span><span style="font-family: Times New Roman;">UI</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">层分离开来。</span></span></span></span></span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"></span></span></span></span>&nbsp;</p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">中央管理的理念是使用一个远程对象管理器来控制</span><span style="font-family: Times New Roman;">Flex</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">与后端的通讯。其构建体系如下图所示</span></span></span></span></span></span></p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-size: small; font-family: Times New Roman;"><img src="http://yongniu.files.wordpress.com/2008/07/central1.png" height="637" alt="" width="721" />&nbsp;</span></span></span></span></span></p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"></span></span></span></span>&nbsp;</p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">图中每一个</span><span style="font-family: Times New Roman;">UI</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">组件都将调用一个服务（</span><span style="font-family: Times New Roman;">Service</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">），服务类将调用中央管理器（</span><span style="font-family: Times New Roman;">Central Manager</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">），中央管理器类将调用服务器端的解决方案。而图中全局对象管理器（</span><span style="font-family: Times New Roman;">Global Object Manager</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">）将用来在</span><span style="font-family: Times New Roman;">UI</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">之间传递数据。</span></span></span></span></span></span></p>
<p><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';"><span style="font-size: small;">现在来看看简单密友列表应用的实现。</span></span></span></span></span></span></p>
<p><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-size: small;"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">首先是</span><span style="font-family: Times New Roman;">LoginView.xml</span></span></span></span></span></span></p>
<pre name="code" class="xml">&lt;?xml version=”1.0″ encoding=”utf-8″?&gt;
&lt;mx:Panel xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute” width=”300″ height=”200″ horizontalAlign=”center” verticalAlign=”middle” title=”Flex Central Manager Login”&gt;
&lt;mx:Script&gt;
 &lt;![CDATA[
  import com.ny.flex.centralManagement.service.LoginService;
  import mx.validators.Validator;
  import mx.containers.ViewStack;
  import mx.rpc.events.ResultEvent;
  private function login():void{
   if(Validator.validateAll(validators).length == 0){
    LoginService.getInstance().login(username.text,password.text);
   }  
  }
 ]]&gt;
&lt;/mx:Script&gt;
 &lt;!–  Validators–&gt;
 &lt;mx:Array id=”validators”&gt;
    &lt;mx:StringValidator  id=”userNameValidator” source=”{username}”  property=”text”  required=”true”/&gt;
    &lt;mx:StringValidator  id=”passwordValidator” source=”{password}”  property=”text” required=”true” /&gt;
 &lt;/mx:Array&gt;   
&lt;mx:Form id=”loginForm” x=”0″ y=”0″&gt;
          &lt;mx:FormItem label=”Username:” &gt;
               &lt;mx:TextInput id=”username” /&gt;
           &lt;/mx:FormItem&gt;
           &lt;mx:FormItem label=”Password:” &gt;
               &lt;mx:TextInput id=”password” displayAsPassword=”true” /&gt;
           &lt;/mx:FormItem&gt;
           &lt;mx:FormItem direction=”horizontal” verticalGap=”15″ paddingTop=”5″ width=”170″&gt;
               &lt;mx:Button id=”loginBtn” label=”Login” click=”login()”/&gt;
           &lt;/mx:FormItem&gt;
    &lt;/mx:Form&gt;
    
&lt;/mx:Panel&gt;
</pre>
<p>&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<p><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-size: small;"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">其功能的核心是：</span><span style="font-family: Times New Roman;"><span lang="ZH-CN"> </span></span></span></span></span></span></span></p>
<p><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-size: small;"><span style="font-family: Times New Roman;"><br /><em><strong>LoginService.getInstance().login(username.text,password.text);</strong></em>&nbsp;</span></span></span></span></span></span></p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"></span></span></span></span>&nbsp;</p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">它的作用是有效的分离了商务逻辑层和视图组件。在此服务类程序不需支持任何状态，因此我们保持其单件模式（</span><span style="font-family: Times New Roman;">singleton</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">）。</span></span></span></span></span></span></p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: Times New Roman;">LoginService</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">类文件如下：</span></span></span></span></span></span></p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"></span></span></span></span>&nbsp;</p>
<pre name="code" class="xml">import com.ny.flex.centralManagement.event.DataManagerResultEvent;
 import com.ny.flex.centralManagement.manager.GlobalObjectManager;
 import com.ny.flex.centralManagement.manager.RemoteObjectManager;
 
 public class LoginService
 {
  public var roManager:RemoteObjectManager = null; 
  public var gom:GlobalObjectManager = GlobalObjectManager.getInstance();
  private static var _instance:LoginService =null;
  
  public static function getInstance():LoginService{
   if(_instance == null){
    _instance =  new LoginService(new PrivateClass)
   }
   return _instance;
   
  }
  public function LoginService(privateclass:PrivateClass)
  {
   if(LoginService._instance == null){
    LoginService._instance =  this;
   }
  }
  public function login(userName:String,password:String):void{
 roManager = RemoteObjectManager.getRemoteObjectManager(”flexmvcRO”);
   roManager.addEventListener(”getLoginUser”,loginHandler);
   var params:Array = new Array(userName,password);
   
   roManager.makeRemoteCall(”getLoginUserName”,”getLoginUser”,params);
  }
  private function loginHandler(event:DataManagerResultEvent):void {
   var userName:String = event.result as String;
   if(userName){
    gom.loginUserName = userName;
    gom.viewStackSelectedIndex=1;
   }
  }
 }
</pre>
<p>&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832">&nbsp;</span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">代码中有两个特别的对象：</span></span></span></span></span></span></p>
<p><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-size: small; font-family: Times New Roman;">&nbsp;&nbsp;&nbsp; <span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>RemoteObjectManager</span></span></span></span></span></p>
<p><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-size: small; font-family: Times New Roman;">&nbsp;&nbsp; <span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>GlobalObjectManager</span></span></span></span></span></p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: Times New Roman;">RemoteObjectManager</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">是一个单件的类，用来实现中央管理所有的远程对象通讯。原始的代码来自于</span><span style="font-family: Times New Roman;">Jeff Tapper</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">的博客：</span></span></span></span></span></span></p>
<p><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"></span></span><a href="http://jeff.mxdj.com/creating_a_remote_object_datamanager_in_actionscript_30_for_.htm"><span style="font-size: small;"><span style="color: #800080;"><span style="font-family: Times New Roman;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832">Creating a Remote Object DataManager in ActionScript 3.0 for Flex 2.0</span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"></span></span></span></span></span></a></p>
<p>&nbsp;</p>
<p>RemoteObjectManager.as:</p>
<pre name="code" class="xml">package com.ny.flex.centralManagement.manager
{
	import com.ny.flex.centralManagement.event.DataManagerResultEvent;
	
	import flash.events.EventDispatcher;
	
	import mx.core.Application;
	import mx.resources.ResourceManager;
	import mx.rpc.AbstractOperation;
	import mx.rpc.AsyncToken;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.remoting.mxml.RemoteObject;
	
	public class RemoteObjectManager extends EventDispatcher {
		public var ro:RemoteObject;        
		private var eventName:String;         
		
		private static var instanceMap:Object = new Object();    
		     
		public function RemoteObjectManager(pri:PrivateClass,dest:String){            
			this.ro = new RemoteObject();            
			ro.destination = dest;
		}  
		       
		public static function getRemoteObjectManager(dest:String):RemoteObjectManager{
			if(RemoteObjectManager.instanceMap[dest] == null){               
				RemoteObjectManager.instanceMap[dest] = new RemoteObjectManager(new PrivateClass(),dest);          
			}          
			var dm:RemoteObjectManager= RemoteObjectManager.instanceMap[dest];          
			return dm;        
		}
		public function makeRemoteCall(methodName:String,eventName:String,args:Array=null):void{
			this.eventName = eventName;            
			var op:mx.rpc.AbstractOperation = ro[methodName];  
			ro.addEventListener("result", doResults);            
			ro.addEventListener("fault", doFault);    
			var token:AsyncToken = null;        
			if(args &amp;&amp; args.length &gt;0){                 
				token = op.send.apply(null,args);            
			}  
			else {
				token = op.send();            
			} 
			token.eventName = eventName;       
		}
		private function doResults(event:ResultEvent):void{             
			var e:DataManagerResultEvent = new DataManagerResultEvent(event.token.eventName, event.result); 
			this.dispatchEvent(e);        
		}         
		private function doFault(fault:FaultEvent):void{             
			this.dispatchEvent(fault);         
		} 
	       
		public override function toString():String{             
			return "RemoteObjectDataManager";         
		}    
	 }
}
 /**   PrivateClass is used to make    DataManager constructor private  */   
  class PrivateClass{
    public function PrivateClass() {} 

 }

</pre>
<p>&nbsp;</p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">&ldquo;</span><span style="font-family: Times New Roman;">GlobalObjectManager</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">&rdquo;用来在</span><span style="font-family: Times New Roman;">UI</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">之间传递信息，例如，我们使用</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: 'Courier New';">ViewStack</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">的</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: 'Courier New';">selectedIndex</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">来决定显示</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: 'Courier New';">ViewStack</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">中的哪一个视图，则使用全局对象</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: 'Courier New';">viewStackSelectedIndex</span><span style="font-family: Times New Roman;">&nbsp;</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">，其代码如下面的黑体部分：</span></span></span></span></span></span></p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">
<pre name="code" class="xml">&lt;?xml version=”1.0″ encoding=”utf-8″?&gt;
&lt;mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml“  xmlns:views=”com.ny.flex.centralManagement.views.*” layout=”absolute”  width=”100%” height=”100%”&gt;
&lt;mx:Script&gt;
 &lt;![CDATA[
  import mx.binding.utils.BindingUtils;
  import com.ny.flex.centralManagement.manager.GlobalObjectManager;
  [Bindable]
  public  var gom:GlobalObjectManager=GlobalObjectManager.getInstance();
 ]]&gt;
&lt;/mx:Script&gt;
    &lt;mx:HBox  horizontalAlign=”center” verticalAlign=”top”  width=”100%” height=”100%” y=”0″ x=”0″&gt;
    &lt;mx:ViewStack id=”viewStack”  resizeToContent=”true” selectedIndex=”{gom.viewStackSelectedIndex}” &gt;
        &lt;views:LoginView  /&gt;
        &lt;views:BuddyListView/&gt;
    &lt;/mx:ViewStack&gt;
    &lt;/mx:HBox&gt;
&lt;/mx:Application&gt;
</pre>
<font size="3"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><font face="SimSun" style="mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">
<p>&nbsp;再回头看看在</p>
</font><span style="font-family: Times New Roman;">LoginService </span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">代码中的</span><span style="font-family: Times New Roman;">loginHandler</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">方法，在此</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: 'Courier New';">viewStackSelectedIndex</span><span style="font-family: Times New Roman;">&nbsp;</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">全局对象被更新。</span></span></span></span></span></font></span>
<p><span style="font-family: Times New Roman;">LoginService </span></p>
<span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">代码中的</span><span style="font-family: Times New Roman;">loginHandler</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">方法，在此</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: 'Courier New';">viewStackSelectedIndex</span><span style="font-family: Times New Roman;">&nbsp;</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">全局对象被更新。</span></span></span></span></span></span></span></span></span></span>
<p>&nbsp;</p>
</p>
<p>&nbsp;</p>
<p><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: 'Courier New';"><span style="background-color: #e0e0e0;">
<pre name="code" class="xml"> private function loginHandler(event:DataManagerResultEvent):void {
   var userName:String = event.result as String;
   if(userName){
    gom.loginUserName = userName;
    gom.viewStackSelectedIndex=1;
   }
  }</pre>
<p class="a" style="MARGIN: 0in 0in 0pt 21pt">&nbsp;</p>
</span></span>
<p class="a" style="MARGIN: 0in 0in 0pt 21pt">&nbsp;</p>
</span></span></span></span></p>
<p class="a" style="MARGIN: 0in 0in 0pt 21pt">&nbsp;</p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: 'Courier New';">[Bindable]</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">元标签使得其值的改变立刻生效。</span></span></span></span></span></span></p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: Times New Roman;">BuddyList.mxml</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">代码：</span></span></span></span></span></span></p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832">
<pre name="code" class="xml">&lt;?xml version=”1.0″ encoding=”utf-8″?&gt;
&lt;mx:Panel xmlns:mx=”http://www.adobe.com/2006/mxml” title=”Buddy List of {gom.loginUserName}” creationComplete=”init()” width=”500″ height=”320″&gt;
&lt;mx:Script&gt;
 &lt;![CDATA[
  import com.ny.flex.centralManagement.service.BuddyService;
  import com.ny.flex.centralManagement.manager.GlobalObjectManager;
  import mx.collections.ArrayCollection;
  import mx.rpc.events.ResultEvent;
  [Bindable]
  public var gom:GlobalObjectManager = GlobalObjectManager.getInstance();
  
  private function init():void{
   BuddyService.getInstance().getBuddyList();
  }
 ]]&gt;
&lt;/mx:Script&gt;

 &lt;mx:DataGrid id=”buddyList”  dataProvider=”{gom.mybuddyList}”  borderStyle=”none” width=”100%” height=”100%” &gt;
       &lt;mx:columns&gt;
        &lt;mx:DataGridColumn dataField=”firstName” headerText=”First Name”/&gt;
        &lt;mx:DataGridColumn dataField=”lastName” headerText=”Last Name”/&gt;
    &lt;/mx:columns&gt;

 &lt;/mx:DataGrid&gt;
&lt;/mx:Panel&gt;

</pre>
<p>&nbsp;</p>
</span></span></span></span></span>
<p>&nbsp;</p>
</p>
<p>&nbsp;</p>
<p class="a" style="MARGIN: 0in 0in 0pt 21pt"><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: Times New Roman;">BuddyService</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">是另一个服务类代码用来和远程对象通讯。</span></span></span></span></span></span></p>
<p class="a" style="MARGIN: 0in 0in 0pt 21pt"><span style="font-size: small; font-family: Simsun;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"></span></span></span></span></p>
<p class="a" style="MARGIN: 0in 0in 0pt 21pt"><span style="font-size: small; font-family: Simsun;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"></span></span></span></span></p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">这是最符合本人喜好的</span><span style="font-family: Times New Roman;">Flex</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">程序的框架结构。它的优点是非常的清晰，没有累赘的发送和监听事件的工作，并且代码非常容易维护。遗憾的是，在此还没有获得足够的理论支持这一框架理论。</span></span></span></span></span></span></p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"></span></span></span></span></p>
<p><span style="font-size: small;"><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">再来看看</span><span style="font-family: Times New Roman;">MVC</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">框架的代表：</span><span style="font-family: Times New Roman;">MVC-Cairngorm</span></span></span></span></span><span style="mso-bookmark: _Toc95897332"><span style="mso-bookmark: _Toc96098685"><span style="mso-bookmark: _Toc96352983"><span style="mso-bookmark: _Toc103311832"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">。</span></span></span></span></span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://houwei.javaeye.com/blog/219666#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 Jul 2008 21:34:41 +0800</pubDate>
        <link>http://houwei.javaeye.com/blog/219666</link>
        <guid>http://houwei.javaeye.com/blog/219666</guid>
      </item>
      <item>
        <title>Flex 开发架构(一): 混沌未开－Flex-all-in-one</title>
        <author>houwei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://houwei.javaeye.com">houwei</a>&nbsp;
          链接：<a href="http://houwei.javaeye.com/blog/219304" style="color:red;">http://houwei.javaeye.com/blog/219304</a>&nbsp;
          发表时间: 2008年07月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-family: Times New Roman;">
<p><span style="font-size: 12pt; font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: SimSun; mso-ansi-language: ZH-CN; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">
<p class="MsoNormal" style="MARGIN: 0in 0.9pt 5pt 13.6pt; TEXT-INDENT: -7.5pt; mso-layout-grid-align: none"><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: SimSun; mso-ansi-language: ZH-CN;">混沌未开，顾名思义就是匹萨店里面烘烤的色香味俱全的一个</span><span style="mso-fareast-font-family: SimSun"><span style="font-family: Times New Roman;">pizza</span></span><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: SimSun; mso-ansi-language: ZH-CN;">大饼，在一个面饼的底板上，混合所有的原料。<span lang="ZH-CN"> Lets make Pizza!</span></span></p>
<p class="MsoNormal" style="MARGIN: 0in 0.9pt 5pt 13.6pt; TEXT-INDENT: -7.5pt; mso-layout-grid-align: none">&nbsp;</p>
<p><span style="font-family: Times New Roman;">Flex</span><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">与生俱来的是它的事件驱动（</span><span style="font-family: Times New Roman;">event-driven</span><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">）的特点。就是说，</span><span style="font-family: Times New Roman;">Flex</span><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">可以使用它的标签做到任何事情。因此开发一个</span><span style="font-family: Times New Roman;">Flex</span><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">应用程序最简单，最基础的方法就是使用</span><span style="font-family: Times New Roman;">Flex</span><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">标签，先来看看代码。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Times New Roman;">Loginview</span><span style="mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">，用户界面部分：</span></p>
<p>&nbsp;</p>
<p><span style="mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">
<pre name="code" class="xml">&lt;mx:Form id=”loginForm” x=”0″ y=”0″&gt;
          &lt;mx:FormItem label=”Username:” &gt;
               &lt;mx:TextInput id=”username” /&gt;
           &lt;/mx:FormItem&gt;
           &lt;mx:FormItem label=”Password:” &gt;
               &lt;mx:TextInput id=”password” displayAsPassword=”true” /&gt;
           &lt;/mx:FormItem&gt;
           &lt;mx:FormItem direction=”horizontal” verticalGap=”15″ paddingTop=”5″ width=”170″&gt;
               &lt;mx:Button id=”loginBtn” label=”Login” click=”login()”/&gt;
           &lt;/mx:FormItem&gt;
 &lt;/mx:Form&gt;
</pre>
<font style="mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">
<p>&nbsp;</p>
</font></span>
<p>&nbsp;</p>
</p>
<p>&nbsp;</p>
<p>
<p><span style="mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">使用</span><span style="font-family: Times New Roman;"> &lt;mx:RemoteObject&gt; </span><span style="font-family: SimSun; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman';">标签调用远程服务：<