Browse > Home > Archive by category 'Design Pattern'

| Subcribe via RSS

元标签注入式MVC框架: InjectMVC

五月 31st, 2010 | No Comments , 179 views | Posted by flashlizi in Design Pattern, Flash CS3/AS3

什么是依赖注入(Dependency Injection)?

依赖注入DI在我们编程中其实随处可见,你也可能正在用构造函数注入,setter注入,属性注入等。网上资料随处可以见,在此就不赘述。

什么是元标签(metadata)注入?

有过flex编程经验的可能都知道如[SWF]、[Bindable]、[Event]这样的元标签metadata,flex编译器会根据不同的metadata
会赋予swf特定的属性或者生成特定的as代码来达到我们的目的。 当我们加上-keep-as3-metadata+=MetaName这样编译参数后,编译器会把指定的metadata保存到编译的swf中去。当你再用describeType()方法获取某个有metadata标记的类的XML描述的时候,你会看到你定义的metadata。基于这样的原理,我们便可以利用这一特性实现特殊的注入。

什么是元标签注入式MVC框架?

这是本人根据这种框架的特性命名的。最典型的当属robotlegs (注:可参考eidiot翻译的robotlegs最佳实践)。本框架也是受了它很大的启发,当然InjectMVC有它自己的特点:可注入事件,框架更简单小巧等。(对robotlegs熟悉的朋友可以直接下载demo和源码了解InjectMVC的特别之处)

InjectMVC里Context的作用?

Context是InjectMVC的中枢,有点像puremvc里的Facade,它负责初始化和管理MVC的核心部分Model、View、Controller。 但它跟Facade不一样,它不是单例,可以被实例化。一般来说,一个context定义一个作用域。MVC成员Mediator、Proxy、Command在context范围内的相互通讯和协作。每个context对应一个显示对象application。

Context有一个非常重要的成员Injector,它负责映射和注入属性和事件给Mediator、 Proxy、Command。但你无需直接操作Injector,它已经被封装到context里,你要做的就是注册Mediator、Proxy、Command,并注入你所需要的属性和事件。Context还有一个contextDispatcher,它负责发送和响应context事件。

Context提供以下API供其MVC成员调用来完成彼此的通讯和协作:

* registerMediator
* getMediator
* removeMediator
* hasMediator
* registerProxy
* getProxy
* removeProxy
* hasProxy
* registerEvent
* removeEvent
* dispatchEvent

当你用上面的方法注册一个mediator,proxy或event的时候,InjectMVC会自动注入它们用[Inject]原标签定义的依赖,并保存它们的映射以供其他类注入使用。

比如,我们注册了这么一个mediator:
registerMediator(btn, ButtonMediator);

那么,我们在之的某个Command中便可以注入这个ButtonMediator:
package
{
public class CustomCommand extends Command
{
[Inject]
public var btnMediator:ButtonMediator;
override public function execute()
{
btnMediator.doSomeThing();
}
}
}

更多的文档请到这里参考wiki

InjectMVC相关下载:

* 演示(含源码)
* InjectMVC(源码及SWC)

AS3设计模式:模板方法模式(Template Method Pattern)

一月 29th, 2008 | No Comments , 219 views | Posted by flashlizi in Design Pattern

什么是模板方法(Template Method)模式?

我们经常会用到template,使用过PPT或者office工具的人都应该非常清楚template的作用。模板方法模式是最为常见的模式之一,它是基于继承的代码复用思想,其结构和用法也体现了面向对象程序设计的核心。

模板方法模式的结构由抽象类(Abstract Class)和具体子类(Concrete Class)两部分组成。抽象类就像一个模板,给出了一个对象的轮廓和骨架。它包含一些基本方法(primitive method),但并没有具体实现,就像接口Interface一样,这些基本方法由具体子类来实现。抽象类还包含一个将这些基本方法集合起来的方法,叫做模板方法(template method),由此而产生了模板方法模式。

AS3中的抽象类(Abstract Class)

抽象类无法实例化instantiate,只能扩展extend。与接口Interface只定义公开方法名而不实现不同,抽象类定义了接口和实现。我们接触的一些AS3的内置类,如DisplayObject和InteractiveObject等都是抽象类。AS3并不支持抽象类,但是我们还是可以使用抽象类和和抽象方法的思想。在C#/Java等语言中可以使用abstract关键字定义抽象方法,这样子类必须覆盖这些抽象方法。但是AS3中没有abstract关键字,因此我们可以在抽象方法里抛出错误的方法,这样如果在运行时runtime调用抽象方法就会抛出一个错误,但可以编译通过。

模板方法(Template Method)模式示例

相信大家都用过文章内容管理系统(CMS),通常里面会有一个文章模板,大家使用文章模板来发表文章。下面我们来看看模板方法模式是如何实现这个过程的。

1、定义文章模板抽象类ArticleTemplate:

2、定义Actonscript文章子类ASArticle:

3、再定义Javascript文章子类JSArticle:

4、最后我们来看看测试类Test:


运行结果为:

创建AS文章标题: AS3设计模式

创建AS文章作者: flashlizi

创建AS文章内容: 模板方法模式的具体内容

AS文章发布成功

创建JS文章标题: JavaScript内存泄露

创建JS文章作者: RIAidea.com

创建JS文章内容: JavaScript内存泄露的文章内容

JS文章发布成功

点击下载示例源文件

AS3设计模式:备忘录模式(Memento Pattern)

一月 28th, 2008 | No Comments , 257 views | Posted by flashlizi in Design Pattern

什么是备忘录(Memento)模式?

在不破坏封装性的前提下,保存一个对象当前的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。这就是Memento模式需要解决的问题。

Memento模式并没有一个非常准确的API,但是它大致涉及到3个角色:originator(发起者),memento(备忘录),caretaker(管理者)。originator可以是任何你要保存状态的对象,它必需定义设置和获取memento的方法,用来保存和恢复状态。memento跟originator是紧密相关的,因为它要保存originator的状态,就必须知道需要保存的状态的类型及数量。caretaker提供保存及恢复memento的方法。

Memento模式是如何实现的?

经常使用计算机的人恐怕对系统备份(Memento)不会陌生,当你的Windows系统运行正常时,对它进行备份,当系统运行有问题时,就可以调用备份快速的将系统恢复,这样就可以大量节省重新装系统的时间。下面我们来看看用Memento模式是如何实现这个过程的。

1、定义操作系统WindowsSystem类,即Memento模式中的originator:

2、定义备份Memento类,即Memento模式中的memento:

3、定义用户(User)类,即Memento模式中的caretaker:

4、最后我们来看看测试类Test:

输出结果为:
当前系统状态为:正常
当前系统状态为:异常
当前系统状态为:正常

总结:

此例非常简单,保存的状态是一个字符串属性_state。在实际应用中,我们保存的状态属性可能不止一个。另外,这里的User只保存最后一个memento,在有些情况下我们可能需要保存一系列memento,即保存多个备份,然后根据不同的情况选择不同的备份进行恢复。因此需要修改caretaker来进行调整。这个在游戏开发中可能会经常遇到。

点击下载此例的源码

AS3设计模式:单例模式(Singleton Pattern)

十一月 9th, 2007 | No Comments , 220 views | Posted by flashlizi in Design Pattern

什么是单例模式?

在面向对象的编程中,有时候会要求一个类有且仅存在一个实例,并提供一个全局的访问方法。所以我们在设计这样的类的时候,就需要思考如何避开构造函数,提供一种机制来实现单例(单一实例)。这就是单例模式。另因为在AS3中无法操作线程,因此我们无需考虑多线程情况下的单例。

单例模式的几种AS3实现

在AS3中有多种方法可以实现Singleton模式,首先看下面的方法1:

此方法通过静态私有变量_instance来创建Singleton类的实例,通过getInstance方法来访问这个单一实例。另外,由于在AS3中不允许private、protected的构造函数,只能是public,因此需要防止用构造函数来创建Singleton类的实例。这个方法有个问题就是这个类的实例会在程序一开始就创建。

方法2:

此方法通过一个静态私有变量_singleton来控制_instance的创建,保证其唯一性。并且这个方法不存在方法1中的问题,_instance实例只有在调用getInstance()方法后才会创建。

方法3:

此方法通过对构造函数增加参数来控制单个实例的创建。此构造函数只有传入参数为私有方法hidden的时候,才能创建实例。私有方法hidden对外的不可见性保证了单例的实现。

方法4:

此方法和方法3相似。这里利用了包外类对外的不可见性(Singletoner类仅在此as文件内可见)来保证单例的实现。

总结

单例模式的实现方式很多,在不同的需求下选择合适的才是最好的。比如方法1虽然一开始就会创建实例,但它不会像其他方法每次调用实例都要检查是否存在类的实例。Singleton模式只考虑实例的创建,而没有考虑到销毁,由垃圾回收机制自行处理。另外,你也可以扩展Singleton模式,比如稍做修改保证一个类只有少数几个实例,来实现一些特殊的目的,这样做也是合理和有意义的。