Swiftsuspenders2 是一个基于元数据(metadata)的IOC(控制反转,inversion of control)的AS3的解决方案。反转控制又被称依赖注射(Dependency Injection),也就是将依赖先剥离,然后在适当时候再注射进入。它是一种降低耦合度的程序设计模式其核心原则是高层模块不应依赖于低层模块,他们都应该依赖于抽象。抽象不依赖细节,细节依赖抽象,它通过将对象的创建过程解耦出来来降低对象间的依赖关系。IOC的设计目标是不直接创建对象,但是描述对象的创建方式,在代码中不直接链接对象和服务,通过配置的方式描述哪一种组件需要哪一些服务,然后在ioc容器中负责自动将对象服务和需要使用他们的地方进行链接。下面我们通过一个简单的例子,先了解一下如何利用依赖注入进行解耦。

关于依赖注入

当我们需要进行一个发送消息或者邮件的流程时 我们可能会写如下代码(demo0):

 package  demo0
{
/**
* ...
* @author titi
*/
public class Mail
{
public var Title:String; public function Send():void
{
trace(" Send Mail:"+Title);
} public function Mail(title:String)
{
Title = title;
} }   }
  
  
package demo0
{
/**
* ...
* @author titi
*/
public class Notification
{
private var _email:Mail;
public function Notification()
{
_email = new Mail("测试邮件1");
} public function PromotionalNotification():void
{
_email.Send();
}
}   }
  
  
package demo0
{
import flash.display.Sprite;
import flash.events.Event; /**
* ...
* @author titi
*/
public class Main0 extends Sprite
{ public function Main0():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
} private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var notificatoin:Notification = new Notification();
notificatoin.PromotionalNotification();
} }   }

这里Mail和其控制器Notification 是直接关联的,控制器依赖Mail对象。通过抽象Mail 可以进行解耦降低Notification和Mail的耦合度。

 package demo1
{ /**
* ...
* @author titi
*/
public interface IMsg
{
function set Title(value:String):void; function get Title():String; function Send():void;
} }
  
package demo1
{
/**
* ...
* @author titi
*/
public class Mail implements IMsg
{
public var _Title:String; public function Send():void
{
trace(" Send Mail:"+Title);
} public function Mail(title:String)
{
_Title = title;
} /* INTERFACE demo1.IMsg */ public function set Title(value:String):void
{
_Title = value;
} public function get Title():String
{
return _Title;
} } } package demo1
{
/**
* ...
* @author titi
*/
public class Notification
{
private var _email:IMsg; public function PromotionalNotification():void
{
_email.Send();
}
} }

抽象后 可以通过四种方式(注入点) 在Notification 中注入IMail对应的具体的Mail 分别是

1、构造函数注入

 package  demo1
{
/**
* ...
* @author titi
*/
public class Notification
{
private var _email:IMsg;
public function Notification(email:IMsg)
{
_email = email;
} public function PromotionalNotification():void
{
_email.Send();
}
} }

2、方法注入

 package  demo1
{
/**
* ...
* @author titi
*/
public class Notification3
{
private var _email:IMsg; public function Notification3()
{ } public function PromotionalNotification(mail:IMsg):void
{
mail.Send();
}
} }

3、属性注入

 package  demo1
{
/**
* ...
* @author titi
*/
public class Notification2
{
private var _email:IMsg; public function Notification2()
{ } public function PromotionalNotification():void
{
_email.Send();
} //提供供外部注入Set属性
public function set email(value:IMsg):void
{
_email = value;
}
} }

4、变量注入

 package  demo1
{
/**
* ...
* @author titi
*/
public class Notification4
{
/**
* 公共变量提供抽象注入
*/
public var _email:IMsg; public function Notification4()
{ } public function PromotionalNotification():void
{
_email.Send();
} } }

在Demo1中我们用如下代码来进行显示的抽象注入:

 package demo1
{
import flash.display.Sprite;
import flash.events.Event; /**
* ...
* @author titi
*/
public class Main1 extends Sprite
{ public function Main1():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
} private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point //构造依赖
var notificatoin:Notification = new Notification(new Mail("测试邮件1"));
notificatoin.PromotionalNotification();
//属性依赖
var notificatoin2:Notification2 = new Notification2();
notificatoin2.email = new Mail("测试邮件2");
notificatoin2.PromotionalNotification();
//方法依赖
var notificatoin3:Notification3 = new Notification3();
notificatoin3.PromotionalNotification(new Mail("测试邮件3"));
//变量依赖
var notificatoin4:Notification4 = new Notification4();
notificatoin4._email=new Mail("测试邮件4")
notificatoin4.PromotionalNotification();
} } }

执行后输出如下:

  Send Mail:测试邮件1
Send Mail:测试邮件2
Send Mail:测试邮件3
Send Mail:测试邮件4

上面2个demo大致说明了如何通过依赖注入对现有的逻辑进行解耦,接下来我们用Swiftsuspenders2框架来快速实现上述的demo1作为对Swiftsuspenders2框架的入门详细参考如下demo2代码。

 package  demo2
{
/**
* ...
* @author titi
*/ [Inject(name="email1")]
public class Notification
{
private var _email:IMsg;
public function Notification(email:IMsg)
{
_email = email;
} public function PromotionalNotification():void
{
_email.Send();
}
} } package demo2
{
/**
* ...
* @author titi
*/
public class Notification2
{
private var _email:IMsg; public function Notification2()
{ } public function PromotionalNotification():void
{
_email.Send();
} public function get email():IMsg
{
return _email;
} [Inject(name="email2")]
public function set email(value:IMsg):void
{
_email = value;
}
} }
package demo2
{
/**
* ...
* @author titi
*/
public class Notification3
{
private var _email:IMsg; public function Notification3()
{ } [Inject(name = "email3")]
public function inject(mail:IMsg):void
{
_email = mail;
} public function PromotionalNotification():void
{
_email.Send();
}
} } package demo2
{
/**
* ...
* @author titi
*/
public class Notification4
{
/**
* 公共变量提供抽象注入
*/ [Inject(name = "email4")]
public var _email:IMsg; public function Notification4()
{ } public function PromotionalNotification():void
{
_email.Send();
} } } package demo2
{
import flash.display.Sprite;
import flash.events.Event;
import org.swiftsuspenders.Injector; /**
* ...
* @author titi
*/
public class Main2 extends Sprite
{ public function Main2():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
} private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point //申明注入器
var injector:Injector = new Injector(); injector.map(IMsg, "email1").toValue(new Mail("测试邮件1"));
injector.map(IMsg, "email2").toValue(new Mail("测试邮件2"));
injector.map(IMsg, "email3").toValue(new Mail("测试邮件3"));
injector.map(IMsg, "email4").toValue(new Mail("测试邮件4")); (injector.instantiateUnmapped(Notification) as Notification).PromotionalNotification();
(injector.instantiateUnmapped(Notification2) as Notification2).PromotionalNotification();
(injector.instantiateUnmapped(Notification3) as Notification3).PromotionalNotification();
(injector.instantiateUnmapped(Notification4) as Notification4).PromotionalNotification();
} } }

Robotlegs2 学习笔记 -- SwiftSuspenders 2.x (1)的更多相关文章

  1. Robotlegs2 学习笔记 -- SwiftSuspenders 2.x (2)

    Swiftsuspenders2简介 Swiftsuspenders2是一个基于元数据(metadata)的IOC(控制反转,inversion of control)的AS3的解决方案.(对于元数据 ...

  2. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  3. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  4. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  5. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  6. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  7. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  8. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  9. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

随机推荐

  1. Python基础教程【读书笔记】 - 2016/7/18

    希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第七波:第3章 字符串 介绍如何使用字符串格式化其他的值,并简单了解一下利用字符串的分割.联接.搜索等方法能做些什么. ...

  2. (转)关于List中FindAll用法的一些简单示例

    本文转载自:http://blog.csdn.net/luoxufeng/article/details/6925982 using System; using System.Collections. ...

  3. Windows组策略同步问题

    每当,我们在域控制器上建立一个组策略的时候,我们很希望它能在线马上同步到所有的客户端上去. 当windows2008的域控上的做法:登录到每台windows客户端然后执行,gpupdate /forc ...

  4. C3P0数据库连接池的相关bug解决

    数据库连接池的几个常见bug: 1.警告: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76c7022e -- ...

  5. PHP “Warning: session_start()...”、"correct (..\..\php5\Temp) in Unknown on line 0" 的解决方法

    运行php的时候出现了一下警告: Warning: Unknown: open(D:/Program Files/php5/temp1\sess_l5b1a48m6kmb1g0t5cs33690v0, ...

  6. UVA 12563 劲歌金曲(01背包)

    劲歌金曲 [题目链接]劲歌金曲 [题目类型]01背包 &题解: 题意:求在给定时间内,最多能唱多少歌曲,在最多歌曲的情况下,使唱的时间最长. 该题类似于01背包问题,可用01背包问题的解题思路 ...

  7. NeHe OpenGL教程 第二十八课:贝塞尔曲面

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  8. 7.4 gcd

    # include<stdio.h>int main(){ int gcd(int a,int b); int n,i,x,y,c; scanf("%d",&n ...

  9. sublime3的licence(update 2016-04-14)

    —– BEGIN LICENSE —–Michael BarnesSingle User LicenseEA7E-8213858A353C41 872A0D5C DF9B2950 AFF6F667C4 ...

  10. Mac 10.10下安装MySQL5.6.21提示安装失败

    只要要在安装的第三步在自定里不要选Startup item就可以了