Iterator

パターンの目的

p.275,line.3-4: 集約オブジェクトが基にある内部表現を公開せずに、その要素を順にアクセスする方法を提供する。

GoF パターンのクラス図

structure-08-05:iterator

MixJuice 版 Iterator (改善)

解決される GoF パターンの問題点

情報隠蔽の問題点

p.280,line.24-29: しかし、そのような特権的なアクセス権は、新しい走査を定義するのを困難にする。なぜならば、それは別のフレンドクラスを追加することになるため、 aggregateのインターフェイスを変えなければならないからである。この問題を避けるために、aggregateの重要だが公開されていないメンバにアクセスするために、Iteratorクラスに保護的なオペレーションを入れておくこともできる。Iteratorのサブクラスは、aggregateに対して特権的なアクセス権を得るために、このオペレーションを使う(これはIteratorのサブクラスだけの特徴である)。

対策

Iterator が利用するオペレーションと、公開オペレーションの名前空間分離を行なう。

結果

Iterator が利用するオペレーションの他のモジュールが不用意に呼び出すことを避けることができる。

なお Java では JDK1.1 では package 、 JDK1.2 以降では nested class を使って、 Iterator 用のオペレーションを情報隠蔽している。しかし、この方法では、・・・という問題がある。

構造

structure-08-09:iterator

module aggregate {
  define class Aggregate {
    define abstract Iterator createIterator();
  }

  define class Iterator {
    define abstract void first();
    define abstract void next();
    define abstract boolean isDone();
    define abstract Object currentItem();
  }
}

module aggregate.implementation extends aggregate {
  define class ConcreteAggregate extends Aggregate {
    Iterator createIterator() {...}
  }
  define class ConcreteIterator extends Iterator {
    // ConcreteAggregate の内容を直接アクセス
    void first() {...}
    void next() {...}
    boolean isDone() {...}
    Object currentItem() {...}
  }
}

MixJuice によるデザインパターン改善カタログ


田中 哲 <akr@m17n.org>, 一杉 裕志 <y-ichisugi@aist.go.jp>