Patrón de diseño de iterador de patrones de diseño

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.

  1. Conceptos relacionados
  2. escenas que se utilizarán
  3. Implementación de Java
  4. 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:

  1. Proporcionar un método transversal para una determinada estructura de datos específica definida;
  2. Para ocultar los detalles de implementación de los objetos agregados, puede utilizar el patrón de diseño del iterador;
  3. 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.

Supongo que te gusta

Origin blog.csdn.net/jzman/article/details/108860488
Recomendado
Clasificación