El texto original se publicó por primera vez en la cuenta pública de WeChat: Jongxingzhi (jzman-blog)
El patrón de diseño de iterador es un patrón de diseño de uso común que proporciona una manera de acceder secuencialmente a varios elementos en un objeto agregado sin exponer la representación interna del objeto.El patrón de diseño de iterador es un patrón de diseño de comportamiento.
- Conceptos relacionados
- escenas que se utilizarán
- Implementación de Java
- Implementación de dardos
Conceptos relacionados
- Función de agregación abstracta: define métodos para agregar, eliminar y otras operaciones en objetos agregados, así como métodos para crear iteradores;
- Rol de agregación concreta: la clase concreta de realización del rol de agregación abstracta;
- Función de iterador abstracto: define métodos relacionados con el iterador, como hasNxt, first, last y otros métodos;
- Rol de iterador concreto: la clase de implementación concreta del rol de iterador abstracto.
escenas que se utilizarán
Los escenarios de uso del patrón de diseño del iterador son los siguientes:
- Proporcionar un método transversal para una determinada estructura de datos específica definida;
- Para ocultar los detalles de implementación de los objetos agregados, puede utilizar el patrón de diseño del iterador;
- Cuando coexisten varios objetos agregados, el patrón de diseño del iterador puede proteger esta diferencia debido a las diferentes estructuras de datos;
Implementación de Java
Simplemente implemente el patrón de diseño del iterador y defina la función de agregación abstracta de la siguiente manera:
/**
* 抽象聚合角色
* Created by jzman
* Powered by 2019/12/22.
*/
interface Aggregate {
Iterator createIterator();
}
Defina el rol de iterador abstracto de la siguiente manera:
/**
* 抽象迭代器角色
* Created by jzman
* Powered by 2019/12/22.
*/
interface Iterator {
Object first();
Object next();
boolean isDone();
Object currentItem();
}
Los roles de agregación específicos y los roles de iterador específicos son los siguientes:
/**
* 具体的聚合角色
* Created by jzman
* Powered by 2019/12/22.
*/
class ConcreteAggregate implements Aggregate {
private List<Object> mList;
public ConcreteAggregate(List<Object> mList) {
this.mList = mList;
}
@Override
public Iterator createIterator() {
return new ConcreteIterator();
}
/**
* 具体的迭代器角色
*/
private class ConcreteIterator implements Iterator {
private int mCursor;
@Override
public Object first() {
return mList.get(0);
}
@Override
public Object next() {
mCursor++;
if (mCursor < mList.size()) {
return mList.get(mCursor);
}
return null;
}
@Override
public boolean isDone() {
return mCursor >= mList.size();
}
@Override
public Object currentItem() {
return mList.get(mCursor);
}
}
}
Pruebe el código anterior:
/**
* 迭代器测试
* Created by jzman
* Powered by 2019/12/22.
*/
class Client {
public static void main(String[] args) {
List<Object> objects = new ArrayList<>();
objects.add("A");
objects.add("B");
objects.add("C");
ConcreteAggregate aggregate = new ConcreteAggregate(objects);
// 获取迭代器
Iterator iterator = aggregate.createIterator();
// 遍历
while (!iterator.isDone()) {
Object o = iterator.currentItem();
System.out.println("data:" + o);
iterator.next();
}
}
}
Los resultados de la prueba son los siguientes:
data:A
data:B
data:C
Implementación de dardos
main(){
List<Object> mList = ["A","B","C"];
Aggregate aggregate = new ConcreteAggregate(mList);
Iterator iterator = aggregate.createIterator();
while (!iterator.isDone()) {
Object obj = iterator.currentItem();
print("data:${obj.toString()}");
iterator.next();
}
}
// 抽象迭代器角色
abstract class Iterator{
Object first();
Object next();
bool isDone();
Object currentItem();
}
//具体迭代器角色
class ConcreteIterator implements Iterator{
int mCursor = 0;
List<Object> mList;
ConcreteIterator(this.mList);
@override
Object first() {
return mList[0];
}
@override
Object next() {
mCursor++;
if (mCursor < mList.length) {
return mList[mCursor];
}
return null;
}
@override
bool isDone() {
return mCursor >= mList.length;
}
@override
Object currentItem() {
return mList[mCursor];
}
}
// 抽象聚合角色
abstract class Aggregate {
Iterator createIterator();
}
// 具体聚合角色
class ConcreteAggregate implements Aggregate{
List<Object> mList;
ConcreteAggregate(this.mList);
@override
Iterator createIterator(){
return new ConcreteIterator(mList);
}
}
Los resultados de la prueba son los siguientes:
data:A
data:B
data:C
Aunque el patrón de diseño de iterador se usa a menudo al atravesar colecciones, es posible que no tenga ningún concepto de patrones de diseño cuando se use. Tal concepto mejorará sutilmente su capacidad de codificación.