[設計モード]反復モード


リピーターモードとは?


プログラムを作成する際には,リストなどの資料構造を順番に閲覧する必要がある場合がある.この場合、反復モードを使用して、閲覧資料の部分をカプセル化して使用します.反復モードを使用すると、資料と資料を使用するオブジェクトの組み合わせを減らすことができます.
反復モードでは、データに順次アクセスする必要がある場合にカプセル化され、クライアントがデータを閲覧しやすいようにします.
資料構造が変化しても,資料の探索作業は重複者に任せられ,クライアントは統一したインタフェースを用い,コードを変更せずに資料を用いることができる.

I奇形機モードのuml図



上の図は奇形腫パターンのUML図です.
反復器と集約クラスがあり、それらを使用するクライアントがあります.
Aggregateは私たちが使っている資料構造です.拡張性のためにインタフェースとして作成し,そのインタフェースを継承するConcreteAggregateがある.
Aggregateクラスには、クラス内の資料を順番に参照するためのIvaratorクラスがあります.他の資料構造に拡張する場合を考慮してインタフェースとする.concreteIdentatorは、特定の資料構造のために作成された反復器クラスです.内部next、firstisDone、currentItemなどで資料を閲覧できます.資料に近づくために参考マークをつけた.

奇形腫パターン例


次のクライアント・プログラムを実行します.クライアントは、Topicクラスを使用してリストにトピックを作成し、順番にブラウズしようとします.
使用するTopicクラスは次のとおりです.
public class Topic {
    private String name;
    
    public Topic(String name) {
        super();
        this.name = name;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }

}
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Topic[] topics = new Topic[5];
        topics[0] = new Topic("topic1");
        topics[1] = new Topic("topic2");
        topics[2] = new Topic("topic3");
        topics[3] = new Topic("topic4");
        topics[4] = new Topic("topic5");
         
        List<Topic> list = new TopicList(topics);
          

        Iterator<Topic> iterator = list.iterator();
         
        while(iterator.hasNext()) {
            Topic currentTopic = iterator.next();
            System.out.println(currentTopic.getName());
        }

	}

}
使用するリストは次のとおりです.これは、上のuml図で見たAggregateインタフェースです.
public interface List<E> {
	Iterator<E> iterator();
}
Aggreagteインタフェースを継承し、特定のAggregateのTopicsListを作成します.TopicListは、リストを参照するためにTopicIdentatorを生成する.Topicはプライベートと宣言し、クライアントは直接使用できず、反復器で使用できます.
public class TopicList implements List<Topic>{
	 private Topic[] topics;
     
	    public TopicList(Topic[] topics)
	    {
	        this.topics = topics;
	    }
	     
	    @Override
	    public Iterator<Topic> iterator() {
	        return new TopicIterator(topics);
	    }
}
次は奇形腫界面です.データ構造に基づいて、reset、next、currentItem、hasNextをサポートしていないことを宣言します.これはクライアントが使用するインタフェースです.
public interface Iterator<E> {
    void reset(); 
    E next();
    E currentItem();   
    boolean hasNext();  
}
Ivalenterを引き継いだTopicIvalenterです.TopicListを参照するクラスを作成します.topicListに適合する形で関数を実現した.
public class TopicIterator implements Iterator<Topic>{
	private Topic[] topics;
	private int position; 
	
	public TopicIterator(Topic[] topics)
    {
        this.topics = topics;
        position = 0;
    }
 
    @Override
    public void reset() {
        position = 0;
    }
 
    @Override
    public Topic next() { 
        return topics[position++];
    }
 
    @Override
    public Topic currentItem() {
        return topics[position];
    }
 
    @Override
    public boolean hasNext() {
        if(position >= topics.length)
            return false;
        return true;
    }
}
以上の設計をuml図で以下に示す.