[AS][自分用]ActionScript3.0デザインパターンの読書メモ(6)
-テンプレートメソッドパターン
テンプレートメソッドとは、
汎用性のあるアルゴリズムを抽象メソッド(中身の無い定義だけのもの)として記述したもので、抽象クラス(インスタンス化を目的としない)内で定義される。
アルゴリズムの中身の具体的な定義は抽象メソッドをオーバーライドするときに定義する。
アルゴリズムの構造はテンプレートメソッドに保持される。
(後で)生成されるサブクラスで詳細を定義するような、”汎用的なアルゴリズム”を定義したいときに使う。
抽象クラスのひとつの使い方って感じなのかな?
テンプレートメソッドが記述されたクラスの例
package {
public class AbstractGame {
//インスタンス化を必要としないので、コンストラクタはいらない
public function AbstractGame() {
}
//(finalメソッドは他のクラスからoverrideできない)
//init()がテンプレートメソッドとなる
public final function init(){
createField()
createTeam("red");
createTeam("blue");
startGame();
}
//直接実行した場合はエラーを投げる
public function startGame():void{
throw new Error("Abstract Method!");
}
//直接実行した場合はエラーを投げる
public function createTeam(name:String):void{
throw new Error("Abstract Method!");
}
//直接実行した場合はエラーを投げる
public function createField():void{
throw new Error("Abstract Method!");
}
}
}
テンプレートメソッドを利用するクラスの例
package {
//テンプレートメソッドを含んだクラスを継承
public class FootballGame extends AbstractGame {
public function FootballGame() {
}
//AbstractGameクラス内のメソッドをオーバーライド
public override function createField():void {
trace("Create Field");
//ここに具体的な処理を書く
}
public override function createTeam(name:String):void {
trace("Create Team");
//ここに具体的な処理を書く
}
public override function startGame():void {
trace("start Game");
//ここに具体的な処理を書く
}
}
}
これらを利用するためのドキュメントクラス
package {
import flash.display.Sprite;
public class FactoryExample extends Sprite{
public function FactoryExample() {
//テンプレートメソッドのサブクラスのインスタンスを作る
var game:FootballGame = new FootballGame();
//サブクラスから、スーパークラスのメソッド(init())を実行する。
game.init();
}
}
}
Tweet