この記事の内容
Iterator Pattern(Iterator Pattern)は、Javaおよび.Netプログラミング環境で非常に一般的に使用されるデザインパターンです。イテレーターパターンは行動パターンです。このモードは、コレクションオブジェクトの基になる表現を知らなくても、コレクションオブジェクトの要素に順次アクセスするために使用されます。
1.イテレータの概要
目的:オブジェクトの内部表現を公開せずに、集約されたオブジェクトの要素に順次アクセスする方法を提供します。
主な解決策:統合オブジェクト全体をトラバースするさまざまな方法。
使用する場合:集約オブジェクトをトラバースします。
解決方法:要素間を移動する責任を、集約オブジェクトではなくイテレーターに与えます。
キーコード:インターフェースを定義します:hasNext、next。
アプリケーション例:JAVAのイテレータ。
1.1長所と短所
利点:1。さまざまな方法で集約オブジェクトのトラバースをサポートします。2.イテレータは、集約クラスを単純化します。3.同じアグリゲーションに複数のトラバーサルが存在する可能性があります。4.イテレータモードでは、元のコードを変更せずに、新しいアグリゲーションクラスとイテレータクラスを追加すると非常に便利です。
短所:イテレータモードはデータの保存とデータのトラバースの責任を分離するため、新しい集約クラスを追加するには、対応する新しいイテレータクラスが必要であり、クラスの数がペアで増加し、システムの複雑さがある程度増加します。
1.2使用シナリオ
使用シナリオ:1。内部表現を公開せずに、集約されたオブジェクトのコンテンツにアクセスします。2.集約されたオブジェクトに対して複数のトラバーサルメソッドを提供する必要があります。3.さまざまな集約構造をトラバースするための統合インターフェースを提供します。
1.3注意が必要な事項
注:イテレーターパターンは、コレクションオブジェクトのトラバーサル動作を分離し、責任を負うイテレータークラスを抽象化するため、コレクションの内部構造が公開されず、コレクション内のデータに外部コードから透過的にアクセスできます。
2、コードの実装
すべてのデザインパターンのコード実装例は、Code Cloudで表示できます。興味がある場合は、確認できます。CodeCloudアドレス:https://gitee.com/no8g/java-design-patterns
2.1一般的なクラス図
上記の例ではイテレータパターンを使用しています。イテレータの一般的なクラス図を見てみましょう。
クラス図は非常に単純ですが、使用するのは非常に面倒なようです。たとえば、上記の例の2つの実装メソッドのうち、どちらが単純だと思いますか。もちろん最初のものです!23のデザインパターンは、コードとデザインの複雑さと結合度を単純化するためのものですが、なぜこのイテレーターパターンプログラムを使用してより複雑にするのですか?何故ですか?JDK 1.2バージョンからjava.util.Iteratorインターフェースが追加され、イテレーターがさまざまなコレクション(コレクション)に徐々に適用されているため、JDK 1.5のAPIヘルプファイルを見ると、java.utilという名前のファイルが表示されます。 。反復可能なインターフェース。それを継承するインターフェースの数を確認してください。
java.util.Iterableインターフェースには1つのメソッドしかありません:iterator()、つまり、iterator()は、集約クラスのすべてのメソッドまたは属性をトラバースするために使用されます。基本的に、すべての高レベル言語にIteratorインターフェースがあります。 Javaはすでにイテレータを用意しています。イテレータを書いてみましょう。「6本の指でスクラッチし、もう1本」ではありませんか。そのため、このイテレータモードも少し低下しています。基本的に、イテレータを個別に作成するプロジェクトはほとんどありません。リストまたはマップを直接使用することで、問題を完全に解決できます。
2.2コードの実装
package com.iot.practice.designpattern.iterator.iteratorpattern;
import java.util.Iterator;
/**
* <p>IProjectIterator 此接口用于:</p>
* <p>@author:hujm</p>
* <p>@date:2021年02月23日 15:26</p>
* <p>@remark:
* 大家可能很奇怪,你定义的这个接口方法、变量都没有,有什么意义呢?有意义,所有的 Java 书上都一直
* 说是面向接口编程,你的接口是对一个事物的描述,也就是说我通过接口就知道这个事物有哪些方法,哪些属性,
* 我们这里的 IProjectIterator 是要建立一个指向 Project 类的迭代器,目前暂时定义的就是一个通用的迭
* 代器,可能以后会增加 IProjectIterator 的一些属性或者方法。当然了,你也可以在实现类上实现两个接口,
* 一个是 Iterator,一个是 IProjectIterator(这时候,这个接口就不用继承 Iterator),杀猪杀尾巴,
* 各有各的杀发。
* </p>
*/
public interface IProjectIterator extends Iterator {
}
package com.iot.practice.designpattern.iterator.iteratorpattern;
/**
* <p>IProject 此接口用于:</p>
* <p>@author:hujm</p>
* <p>@date:2021年02月23日 15:15</p>
* <p>@remark:</p>
*/
public interface IProject {
/**
* 增加项目
*
* @param name 项目名称
* @param num 项目成员数量
* @param cost 项目费用
*/
public void add(String name,int num,int cost);
/**
* 从老板这里看到的就是项目信息
*
* @return 项目信息
*/
public String getProjectInfo();
/**
* 获得一个可以被遍历的对象
*
* @return 一个可以被遍历的对象
*/
public IProjectIterator iterator();
}
package com.iot.practice.designpattern.iterator.iteratorpattern;
import java.util.ArrayList;
/**
* <p>Project 此类用于:</p>
* <p>@author:hujm</p>
* <p>@date:2021年02月23日 15:17</p>
* <p>@remark:</p>
*/
public class Project implements IProject{
/**
* 定义一个项目列表,说有的项目都放在这里
*/
private ArrayList<IProject> projectList = new ArrayList<IProject>();
/**
* 项目名称
*/
private String name = "";
/**
* 项目成员数量
*/
private int num = 0;
/**
* 项目费用
*/
private int cost = 0;
public Project(){}
private Project(String name, int num, int cost) {
// 赋值到类的成员变量中
this.name = name;
this.num = num;
this.cost = cost;
}
@Override
public void add(String name, int num, int cost) {
this.projectList.add(new Project(name, num, cost));
}
@Override
public String getProjectInfo() {
String info = "";
//获得项目的名称
info = info+ "项目名称是:" + this.name;
//获得项目人数
info = info + "\t项目人数: "+ this.num;
//项目费用
info = info+ "\t 项目费用:"+ this.cost;
return info;
}
@Override
public IProjectIterator iterator() {
return new ProjectIterator(this.projectList);
}
}
package com.iot.practice.designpattern.iterator.iteratorpattern;
import java.util.ArrayList;
/**
* <p>ProjectIterator 此类用于:</p>
* <p>@author:hujm</p>
* <p>@date:2021年02月23日 15:27</p>
* <p>@remark:定义一个迭代器</p>
*/
public class ProjectIterator implements IProjectIterator {
/**
* 所有的项目都放在这里ArrayList中
*/
private ArrayList<IProject> projectList = new ArrayList<IProject>();
private int currentItem = 0;
/**
* 构造函数传入projectList
*
* @param projectList 所有项目集合
*/
public ProjectIterator(ArrayList<IProject> projectList) {
this.projectList = projectList;
}
/**
* 判断是否还有元素,必须实现
*
* @return 是否为true
*/
@Override
public boolean hasNext() {
// 定义一个返回值
boolean b = true;
if (this.currentItem >= projectList.size() || this.projectList.get(this.currentItem) == null) {
b = false;
}
return b;
}
/**
* 取得下一个值,必须实现
*
* @return 下一个值
*/
@Override
public IProject next() {
return this.projectList.get(this.currentItem++);
}
}
終わり!