欣赏ActionScript 3 的元件架构

简介:

欣赏ActionScript 3 的元件架构。
  ActionScript 3 中所有可以被看到的视觉元件都统一于DisplayObject,即其子类的实例。DisplayObject是一个抽象类,不能生成实例。从系统架构设计上来说,这样的超类设计是常识。DisplayObject,我在AS3.0教程(5):强大的事件机制(1)中讲过,继承于EventDispatcher类,也就意味着所有的DisplayObject子类都可以发送事件了。

  啊哈,DisplayObject下面一层的抽象就精彩了,架构设计师的原意是将所有视觉元件分为两大类:可以接受人机交互事件的,和不可以接受人机交互事件的。所以就有了InteractiveObject类和非InteractiveObject类之分。由于非InteractiveObject的几个类之间差别太大,也抽象不出什么共同点,所以,干脆就分成了InteractiveObject的六个同级兄弟 AVM1Movie, Bitmap, MorphShape, Shape, StaticText, Video。但黑羽认为从系统的优雅性出发,不妨就设一个UnInteractiveObject的超类,将这六个孩子放在这个超类的下面。还便于日后的功能扩展。

  在讲最重要的InteractiveObject之前,我们先把这几个不伦不类的兄弟先扫掉。这几个子类中,我们把它分为可以代码创建的,和不可以代码接触的。所谓不可以代码创建的,是指只能通过Flash创作工具来创建的。和以前一样,StaticText还是不可以用代码实现。另外一个是MorphShape,这个东东是指在Flash中创建Shape形变时,由Flash Player自动生成的,同样的,代码无法实现。

  剩下的几个都是可以用代码创建的:Bitmap,位图对象,可以通过BitmapData对象来创建,也可以从外部载入,比如通过loader。Shape,形状,专门用来绘制矢量图的,通过Graphic对象创建的。Video,视频对象,专门用来播放视频的,可以来自文件也可以来自网络流媒体。

  下面要说到的是AVM1Movie,所谓AVM1Movie,意思就是说Actionscript Virtual Machine 1所支持的SWF影片,也就是ActionScript 1和2的影片。由于ActionScript 3 采用的是AVM2,所以和AVM1影片无法跨脚本交流,必须要把它同AVM2 swf影片区分开来,所以有个这个类。关于这个,感兴趣的兄弟看我的这篇文:小谈ActionScript 3.0与AS 2.0,1.0的swf兼容性。这个一般我们不用关心,也不用直接接触,一旦我们加载一个AVM1老影片到AVM2 swf中时,Flash Player 会自动创建一个AVM1Movie的实例包装这个swf。我们打交道的往往是装载AVM1 swf的容器元件。

  到了InteractiveObject下一层了,这一层共有三个类。

  这一层的抽象理念又要赞一下。架构设计师又用了一个容器和非容器的概念来区分视觉元件。所谓容器,就是可以在其中加载其他的DisplayObject子类对象。当然也包括它的叔叔们,即非InteractiveObject的那几个类。所谓非容器,那就是说不能在它的视图里面加入其他的DisplayObject了。“容器”,这个公共性质实在太重要了,在这一层才这样抽象出来实在很高明,很到位。

  那么老套路,先讲讲非容器的两个类,TextField和SimpleButton。 TextField,就基本上是我们熟悉的动态文本框,这里暂不细说。来说说SimpleButton,这个名字虽然和我们在ActionScript 2中碰到的SimpleButton一样,但实际上二者有很大的差别了。实质上,ActionScript 3 中SimpleButton这个类是将Button这个重要常用的UI控件单独提出作为一类,而不是像以前和MovieClip混淆不清。谁都知道,在ActionScript 2和1中,只要改改MovieClip前几个帧的标签,这个MovieClip就变得和Button一样了。关于SimpleButton的使用,可以说非常简洁实用,这个放在后面细说。我在这里所要强调的是Button和MovieClip不是一个性质。虽然ActionScript 3中Sprite和其子类也可以通过buttonMode来做出和Butoon相似的行为,但原理是不同的。

  剩下的就是DisplayObjectContainer类了。DisplayObjectContainer的所有子类对象,都可以在其中添加其他DisplayObject子类对象。但要注意一点,DisplayObjectContainer本身也是一个抽象类,不可以生成实例。这是出于架构设计稳健性扩展性的考虑,和将DisplayObject设计成抽象类的原因一样,不多说了。

  重要的是看看它的几个子类,Sprite, Loader, Stage。 Stage,就是舞台,所有的视觉元件都是在它之中,当之无愧是最终容器,放在这一层也是合情合理。 Loader就有趣了,它把以前MovieClip装载的部分全部抽象分离出来了。所有和外部资源的加载,都是通过Loader来进行的。而Loader也不能直接和网络资源打交道,要通过专门的URLRequest对象来进行,各司其职,非常好。Loader能干什么?装载swf, 和各种图片。注意,视频还是要通过Video类来进行,直接addChild到各种Container中,不一定要放在Loader中。

  下面来了Sprite,这个3.0中我们打交道最多的容器了。一句话,它是去掉了时间轴的MovieClip(即MovieClip被阉掉了)。如我开头例子所说,倘若我们只是为了创建一个容器,那么Sprite是首选。甚至可以说,我们这些写代码的开发人员,90%以上的情况都只需要和Sprite打交道。含有时间轴的MovieClip一般是Flash工具创建出来的,往往只需要加载就可以了。准确的说,Sprite比ActionScript 2中的MovieClip不止少一个TimeLine,如装载。Sprite中也含有Graphic对象,这意味着,它也可以直接在其中代码绘图。但我们始终要记住,Sprite不同于Shape,区别就在于Sprite是容器,而Shape不是。从代码角度说,就是,Sprite可以addChild(),但Shape不可以。

  都说到这儿了,我们亲爱的MovieClip还不见踪影,到底在哪儿了呢?其实就在Sprite的下一层。Sprite下一层中,共有四个子类,MovieClip是其中一个。大家可以想到,现在的MovieClip重要性大不如前了,主要就是代表用Flash创建的含有时间轴的影片。常用的gotoAndStop, currentFrame等等这些属性现在才能碰到了。

  其余三个子类,也是来头不小,最牛的就是其中的FlexSprite。虽然它的改动只是变了一下toString()函数,但它却是所有Flex组件的共同基石。著名的UIComponent的老爸现在就是它了。UIComponent何许人也?天下组件,皆由它出。黑羽大胆预测,我们在Flash 9中所要用到的控件,也就是现在的Flex里面的组件,即mx.controls里面的所有组件。此类不可小看。

  另两个子类Preloader和DownloadProgressBar,已经不属于flash.display包了,而是属于mx.preloaders包,主要管理的是下载进度和共享库的下载等功能,不予细说了。

  到此,ActionScript 3 主要的视觉元件架构已经理出了一个清晰的脉络,设计的原因,理由,思路都做了一一剖析,希望大家喜欢。其实InteractiveObject下的另外两根枝条TextField和SimpleButton也有很重要的地位,在后续教程中会一一细说。

  下面到了老鸟时间了,和老鸟们分享一下我对ActionScript 3 视觉架构的分析心得。可以看出的是,抽象的界限非常明确,应用的模式也比较统一。应用的模式就是OOP编程中最常用的模式之一:Composite模式。比如Shape下的Graphic对象,Sprite下面的SoundTransform对象,Loader下的LoaderInfo对象,等等等等。我本来迷惑,为何不用装饰器模式,让这些元件的行为和ActionScript 2更加相似一些,过渡的痛苦少一些,但转念一想明白了架构设计师的苦心。就是要用这样清清楚楚,明明白白的Composite来加强所有开发者OOD时分工协作,更加快的熟悉和运用新的强大的架构。与这个优点相比,这么一点过渡的痛苦又算得了什么呢?

  关于ActionScript 3视觉编程后续部分和具体的编程例子,会陆续放出。

  P.S:本教程受Creative Commons License.协议保护,未经作者同意,不得用于商业用途。
本文转自jiahuafu博客园博客,原文链接http://www.cnblogs.com/jiahuafu/archive/2009/06/30/1514157.html如需转载请自行联系原作者

jiahuafu

相关文章
|
3天前
|
存储 负载均衡 开发者
深入理解微服务架构中的服务发现机制
【7月更文挑战第19天】在微服务架构的海洋中,服务发现是一艘至关重要的航船,它指引着各个微服务之间的通信与协作。本文将揭开服务发现的神秘面纱,探索其工作原理、实现方式及面临的挑战,为开发者提供清晰的导航,确保服务间的顺畅航行。
|
3天前
|
监控 负载均衡 API
探索微服务架构下的API网关设计
【7月更文挑战第19天】在云原生时代,微服务架构以其灵活性和可扩展性成为企业数字化转型的优选。本文将深入探讨API网关在微服务架构中的核心角色,包括其设计原则、关键功能以及面临的挑战。我们将通过实例分析API网关如何提升系统的可维护性、安全性和性能,并讨论如何在复杂环境中实现高效的API管理策略。
35 9
|
1天前
|
存储 边缘计算 安全
操作系统的未来:容器化与微服务架构的融合
【7月更文挑战第21天】在数字化浪潮不断推进的今天,操作系统的角色和功能正在发生深刻变化。本文将探讨操作系统如何适应现代应用的需求,特别是容器技术和微服务架构对操作系统发展的影响。我们将分析容器化的优势、微服务架构的特点以及它们如何共同推动操作系统的创新,从而为读者揭示一个更加灵活、高效和安全的未来计算环境。
8 2
|
4天前
|
负载均衡 安全 API
探索微服务架构中的API网关模式
【7月更文挑战第18天】在微服务架构中,API网关不仅是流量的守门人,更是服务的协调者。本文将深入探讨API网关的核心作用、设计原则以及实现策略,揭示其在微服务生态系统中不可或缺的地位。通过案例分析,我们将一窥API网关如何优雅地处理服务发现、负载均衡、认证授权等关键任务,同时确保系统的弹性和安全性。
|
5天前
|
Kubernetes API 开发者
探索现代后端开发中的微服务架构
【7月更文挑战第17天】本文深入探讨了微服务架构在现代后端开发中的应用,分析了其设计原则、优势以及面临的挑战。通过具体实例,展示了如何有效实施微服务架构,并讨论了相关技术栈的选择。文章旨在为后端开发者提供微服务实施的指导和最佳实践。
|
1天前
|
敏捷开发 消息中间件 监控
探索后端开发中的微服务架构
本文深入探讨了微服务架构在后端系统设计中的关键作用,分析了其优势、挑战与实施策略。通过比较传统单体应用与微服务的异同,文章阐述了微服务如何促进敏捷开发和持续交付,同时指出了在采用微服务时可能遇到的技术债务和管理复杂性问题。结合具体案例,本文为读者提供了关于如何有效实施微服务的实用建议。 【7月更文挑战第21天】
|
2天前
|
监控 负载均衡 安全
微服务架构下的服务发现与注册:技术深度解析
【7月更文挑战第20天】服务发现与注册是微服务架构中不可或缺的一部分,它确保了服务间的动态发现和通信。通过选择合适的实现工具和遵循最佳实践,可以构建出高效、可靠、可扩展的微服务系统。随着技术的不断进步,未来我们还将看到更多创新的服务发现与注册解决方案的出现。
|
2天前
|
运维 Kubernetes Cloud Native
云原生架构下的微服务治理之道
【7月更文挑战第20天】在数字化转型的浪潮中,企业纷纷拥抱云原生,以期实现更高效的资源利用、更快的业务迭代和更强的系统稳定性。本文将深入探讨如何通过云原生架构优化微服务的治理,确保系统的高可用性和可维护性,同时提升开发效率和运维灵活性。我们将从微服务治理的核心原则出发,结合具体案例,分析在云环境中实施微服务治理的策略与挑战。
|
2天前
|
敏捷开发 设计模式 监控
探索微服务架构中的服务发现机制
【7月更文挑战第20天】在微服务架构的海洋中,服务发现是一艘必不可少的航船,它指引着各个服务如何相互寻觅和沟通。本文将深入探讨服务发现的核心原理、主流解决方案以及在实际应用中的考量因素,为构建高效、稳定的微服务系统提供导航。
7 2
|
6天前
|
消息中间件 负载均衡 网络协议
探索微服务架构中的服务通信模式
【7月更文挑战第16天】在微服务架构的海洋中,服务间的通信宛如细丝相连,维系着整个系统的协同与和谐。本文将深入探讨微服务之间如何通过同步与异步通信模式进行交互,并剖析这些模式背后的技术原理及其对系统性能和可扩展性的影响。我们将从理论到实践,一探究竟。
19 6