<2007/06/15 追記>
これからデザインパターンのコードをUPしていく予定でしたが、
まったく同じ事を既にされている方がいらっしゃって、内容がモロ被りなので
UPしていくのはやめます。わずか一回目で…早い!w
勉強は続けますけどね!
こちらのBlogです。やはり同じようなポイントで悩んでらっしゃったようで、参考になりました!
minfish.jp/blog: ActionScript2.0でデザインパターン(Iteratorの巻き)
</追記>
デザインパターン一回目。こちらの「増補改訂版Java言語で学ぶデザインパターン入門」のサンプルをActionScriptにしただけです。著作権マズいでしょうか…。本には、もっと詳しい説明が載っています。
抽象クラスなどAS2.0にはない概念は、FLASH OOPのサンプルを参考に、コンストラクタをprivateにするとかしてます。
完全にJavaのソースをASにしたわけじゃないので注意です。
というか、抽象クラス、インターフェイスは初めてなので、良く分かってません。
以下、メモ入りまくりのソース。
もっと良い書き方がある!っていうトコは教えて下さい。助かります。
Aggregateインターフェイス
Aggregate・・・「集約」の意
【集約】(名)スル
集めて一つのものにまとめること。
「各支部の意見を-する」
//集合体を表すクラスがこのインターフェイスを実装する
interface Aggregate
{
//makeIteratorメソッドを実装しなければならない
public function makeIterator():Iterator;
}
Iteratorインターフェイス
Iterator・・・「繰り返す」「反復子」の意
集合体を走査する
今回はnextだけだが、前に戻るpreviousとかもアリ。
interface Iterator {
//hasNext、nextメソッドを実装しなければならない
public function hasNext():Boolean;//次ぎがあるか調べる
public function next():Object;//次ぎに進める
}
Bookクラス
本を表現するクラス
class Book{
private var name:String;//本の名前
//コンストラクタ
public function Book(name:String)
{
this.name = name;
}
public function get _name():String
{
//自分の名前を返す
return name;
}
}
BookShelfクラス
本を入れる本棚を表現するクラス
class BookShelf implements Aggregate//集合体を表すAggregateを実装
{
private var book_array:Array;//Bookインスタンス(本)を保存
//コンストラクタ
public function BookShelf()
{
//本棚を作成
this.book_array = new Array();
}
public function appendBook(book:Book)
{
//本棚に本を入れる
book_array.push(book);
}
public function getBookAt(index:Number):Book
{
//指定された番号の本を返す
return book_array[index];
}
public function getLength():Number
{
//本棚の大きさ(配列の長さ)を返す
return book_array.length;
}
public function makeIterator():Iterator
{
//BookShelfIteratorインスタンスを生成して返す
return new BookShelfIterator(this);
}
}
BookShelfIteratorクラス
本棚(BookShelfインスタンス)を自分のプロパティとして持ち、管理する
//本棚を自分のプロパティとして持ち、管理する
class BookShelfIterator implements Iterator
{
private var bookShelf:BookShelf;//管理する本棚
private var index:Number;//注目する本棚の番号
//コンストラクタ
public function BookShelfIterator(bookShelf:BookShelf)
{
//管理する本棚を格納する
this.bookShelf = bookShelf;
index = 0;
}
public function hasNext():Boolean
{
//bookShelf.getLength()は本棚に入っている本の数を返す
if (index < bookShelf.getLength()) {
//まだ本棚に本が入っていればture
return true;
} else {
//もう本棚に本がなければfalse
return false;
}
}
public function next():Object
{
//注目している本を返し、注目番号を次に進める
var book:Book = bookShelf.getBookAt(index);
index++;
return book;
}
}
Mainクラス
注目:whileループで使われているのは、iteratorのメソッドのみで、
bookShelfクラスの実装でつかわれているメソッドは使っていない。
よって、bookShelfクラスの実装に依存しない。
bookShelfクラスが管理の仕方を変更しても、
bookShelfがmakeIteratorメソッドを持っていて、
正しくiteratorを返してくれればいい。
つまり、Iteratorインターフェイスを正しく実装しているインスタンスを返してくれれば、
whileループはまったく変更しなくても動作する。
class Main
{
public function Main()
{
var bookShelf:BookShelf = new BookShelf();//本棚を作る
//本を作って本棚に入れる
bookShelf.appendBook(new Book("Around the World in 80 Days"));
bookShelf.appendBook(new Book("Bible"));
bookShelf.appendBook(new Book("Cinderella"));
bookShelf.appendBook(new Book("Daddy-Long-Legs"));
var iterator:Iterator = bookShelf.makeIterator();
while (iterator.hasNext())//まだ本棚に本があれば繰り返す
{
//iterator.next()・・・今注目している番号の本を返し、番号を一つ進める
var book:Book = Book(iterator.next());
trace(book._name);
}
}
}
実行結果
flaファイル_root第一フレーム
var main:Main = new Main();var main:Main = new Main(); /*出力 Around the World in 80 Days Bible Cinderella Daddy-Long-Legs */
まとめ?
集合体、いろいろあると思うんですが、xmlを解析する時とかに
使えるのかな?
取り敢えず今度使ってみよう。
今回のソースはこちら。コメントアウトが沢山はいったままですが、よければどうぞ。
RSS feed for comments on this post · TrackBack URI
Leave a reply