as3函数模板
AS3的模板方法模式
什么是模板方法(Template Method)模式?
模板方法模式是最为常见的模式之一,它是基于继承的代码复用思想,其结构和用法也体现了面向对象程序设计的核心。
模板方法模式的结构由抽象类(Abstract Class)和具体子类(Concrete Class)两部分组成。
抽象类就像一个模板,给出了一个对象的轮廓和骨架。它包含一些基本方法(primitive method),但并没有具体实现,就像接口Interface一样,这些基本方法由具体子类来实现。
抽象类还包含一个将这些基本方法集合起来的方法,叫做模板方法(template method),由此而产生了模板方法模式。
模板方法模式的结构由抽象类(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:
package com.riaidea.dp.template {
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
public class ArticleTemplate {
public function ArticleTemplate() {
//保证抽象类不被直接实例化
if (getDefinitionByName(getQualifiedClassName(this)) == ArticleTemplate) {
throw new Error("Abstract Method, Can't Be Instantiated!");
}
}
/*
* 模板方法 Template Method
* 使用final关键字保证不被子类覆盖
*/
public final function create():void {
createTitle();
createAuthor();
createContent();
publish();
}
/*
* 抽象方法 Abstract Method
*/
//创建标题
public function createTitle():void {
throw new Error("Abstract Method, Only For Override!");
}
//创建作者
public function createAuthor():void {
throw new Error("Abstract Method, Only For Override!");
}
//创建内容
public function createContent():void {
throw new Error("Abstract Method, Only For Override!");
}
//发布文章
public function publish():void {
throw new Error("Abstract Method, Only For Override!");
}
}
}
2、定义Actonscript文章子类ASArticle:
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
public class ArticleTemplate {
public function ArticleTemplate() {
//保证抽象类不被直接实例化
if (getDefinitionByName(getQualifiedClassName(this)) == ArticleTemplate) {
throw new Error("Abstract Method, Can't Be Instantiated!");
}
}
/*
* 模板方法 Template Method
* 使用final关键字保证不被子类覆盖
*/
public final function create():void {
createTitle();
createAuthor();
createContent();
publish();
}
/*
* 抽象方法 Abstract Method
*/
//创建标题
public function createTitle():void {
throw new Error("Abstract Method, Only For Override!");
}
//创建作者
public function createAuthor():void {
throw new Error("Abstract Method, Only For Override!");
}
//创建内容
public function createContent():void {
throw new Error("Abstract Method, Only For Override!");
}
//发布文章
public function publish():void {
throw new Error("Abstract Method, Only For Override!");
}
}
}
2、定义Actonscript文章子类ASArticle:
package com.riaidea.dp.template{
public class ASArticle extends ArticleTemplate {
private var title:String = "AS3设计模式";
private var author:String = "flashlizi";
private var content:String = "模板方法模式的具体内容";
public function ASArticle() {
}
public override function createTitle():void{
trace("创建AS文章标题: " this.title);
}
public override function createAuthor():void{
trace("创建AS文章作者: " this.author);
}
public override function createContent():void{
trace("创建AS文章内容: " this.content);
}
public override function publish():void{
trace("AS文章发布成功\r");
}
}
}
public class ASArticle extends ArticleTemplate {
private var title:String = "AS3设计模式";
private var author:String = "flashlizi";
private var content:String = "模板方法模式的具体内容";
public function ASArticle() {
}
public override function createTitle():void{
trace("创建AS文章标题: " this.title);
}
public override function createAuthor():void{
trace("创建AS文章作者: " this.author);
}
public override function createContent():void{
trace("创建AS文章内容: " this.content);
}
public override function publish():void{
trace("AS文章发布成功\r");
}
}
}
3、再定义Javascript文章子类JSArticle:
package com.riaidea.dp.template{
public class JSArticle extends ArticleTemplate {
private var title:String = "JavaScript内存泄露";
private var author:String = "RIAidea.com";
private var content:String = "JavaScript内存泄露的文章内容";
public function JSArticle() {
}
public override function createTitle():void{
trace("创建JS文章标题: " this.title);
}
public override function createAuthor():void{
trace("创建JS文章作者: " this.author);
}
public override function createContent():void{
trace("创建JS文章内容: " this.content);
}
public override function publish():void{
trace("JS文章发布成功\r");
}
}
}
4、最后我们来看看测试类Test:
package com.riaidea.dp.template{
import flash.display.Sprite;
public class Test extends Sprite{
public function Test() {
//创建一篇AS文章
var as_article:ASArticle = new ASArticle();
as_article.create();
//创建一篇JS文章
var js_article:JSArticle = new JSArticle();
js_article.create();
}
}
}
运行结果为:
创建AS文章标题: AS3设计模式
创建AS文章作者: flashlizi
创建AS文章内容: 模板方法模式的具体内容
AS文章发布成功
创建JS文章标题: JavaScript内存泄露
创建JS文章作者: RIAidea.com
创建JS文章内容: JavaScript内存泄露的文章内容
public class JSArticle extends ArticleTemplate {
private var title:String = "JavaScript内存泄露";
private var author:String = "RIAidea.com";
private var content:String = "JavaScript内存泄露的文章内容";
public function JSArticle() {
}
public override function createTitle():void{
trace("创建JS文章标题: " this.title);
}
public override function createAuthor():void{
trace("创建JS文章作者: " this.author);
}
public override function createContent():void{
trace("创建JS文章内容: " this.content);
}
public override function publish():void{
trace("JS文章发布成功\r");
}
}
}
4、最后我们来看看测试类Test:
package com.riaidea.dp.template{
import flash.display.Sprite;
public class Test extends Sprite{
public function Test() {
//创建一篇AS文章
var as_article:ASArticle = new ASArticle();
as_article.create();
//创建一篇JS文章
var js_article:JSArticle = new JSArticle();
js_article.create();
}
}
}
运行结果为:
创建AS文章标题: AS3设计模式
创建AS文章作者: flashlizi
创建AS文章内容: 模板方法模式的具体内容
AS文章发布成功
创建JS文章标题: JavaScript内存泄露
创建JS文章作者: RIAidea.com
创建JS文章内容: JavaScript内存泄露的文章内容