Definición: Proporciona un método para acceder a varios elementos en un objeto contenedor sin exponer los detalles internos del objeto.
Tipo: Patrón de comportamiento
Diagrama de clases:
Si desea preguntar el modo más utilizado en Java, la respuesta no es el modo singleton, ni el modo de fábrica, ni el modo de estrategia, sino el modo iterador.
Public static void print (colección coll) {iterator it = coll.iterator (); La función de este método es imprimir un bucle de colección de cadenas, y el patrón de iterador se usa en el patrón de iterador. Cuando se trata de iteradores, en primer lugar, está relacionado con los conjuntos.
La estructura del patrón de iterador
Contenedor abstracto: en general, se proporciona el método Iterator (), como la interfaz de recopilación, la interfaz de lista, la interfaz establecida, etc. en Java.
Contenedor específico: es la clase de implementación concreta de contenedores abstractos, como la lista ordenada de la interfaz de la lista para implementar ArrayList, la lista vinculada de la interfaz de lista para implementar LinkList, la lista hash de la interfaz establecida para implementar hashset, etc.
Iterador abstracto: defina el método requerido para atravesar elementos.
Implementación del iterador: implementa los métodos definidos en la interfaz iteradora para completar la iteración de la colección.
Dar un ejemplo
Dado que las regulaciones del modo iterador en sí están relativamente flojos, la implementación específica es diversa. Demos solo un ejemplo aquí, y no podemos presentar los métodos de implementación uno por uno. Por lo tanto, antes de dar un ejemplo, enumeremos los métodos de implementación del próximo patrón de iterador.
1. El rol iterador define la interfaz para el recorrido, pero no especifica quién controla la iteración. En la aplicación de la colección Java, el proceso de traversal está controlado por el programa del cliente, que se llama iterador externo; Los iteradores externos son flexibles y poderosos que los iteradores internos, y los iteradores internos son muy débiles en el entorno local de Java.
2. No hay ninguna disposición para quién implementará el algoritmo de transversal en el modo iterador. Parece que se da por sentado para implementar roles de iterador. Debido a que es conveniente que se utilicen diferentes algoritmos de recorrido en un contenedor, también es conveniente para aplicar un algoritmo transversal a diferentes contenedores. Pero esto destruye la encapsulación del contenedor: el papel del contenedor debe revelar sus propios atributos privados, que en Java significa exponer sus propios atributos privados a otras clases.
Luego, lo coloquemos en el rol de contenedor para implementarlo. De esta manera, el papel de iterador se anula para almacenar solo una función que atraviesa la ubicación actual. Pero el algoritmo transversal está estrechamente atado a un contenedor específico.
En la aplicación de la colección Java, el rol de iterador específico proporcionado es la clase interna definida en el rol del contenedor. Esto protege el embalaje del contenedor. Pero al mismo tiempo, el contenedor también proporciona una interfaz de algoritmo transversal, y puede extender su propio iterador.
Ok, echemos un vistazo a cómo se implementa el iterador en Java Collection.
// iterator, solo define la interfaz transversal de la interfaz pública iterator {Boolean Hasnext (); Es solo una interfaz, por lo que no se enumerará. Para resaltar los puntos clave, nos referimos a la lista y al contenido relacionado con el iterador // El rol de iterador específico se deriva en forma de una clase interna. AbstractList existe para extraer las partes comunes de cada rol de contenedor específico. Public Abstract AbstractList extiende la lista de implementos de Collection {... // Este es el método de fábrica responsable de crear roles iteradores específicos iterator () {return new itr ();} // como el papel específico de la clase interna implementa iterator {int cursor = 0; } objeto público next () { CheckForComodification (); .THIS.REMOVE (LASTRET); cursor--;En cuanto al uso del modo iterador. Como se enumera en la introducción, el programa del cliente debe obtener primero el rol de contenedor específico y luego obtener el rol iterador específico a través del rol de contenedor específico. De esta manera, puede usar el rol de iterador específico para atravesar el contenedor ...
Pros y contras del modo iterador
Las ventajas del modo iterador son:
El método de recorrido se ha simplificado, y todavía es bastante problemático atravesar la colección de objetos. Después de introducir el método Iterator, es mucho más fácil de usar para los usuarios.
Hay muchas maneras de atravesar, como para las listas ordenadas, podemos proporcionar a dos iteradores un orden positivo y un recorrido de orden inverso de acuerdo con las necesidades.
La encapsulación es buena, y los usuarios solo necesitan que un iterador atraviese, pero no tienen que preocuparse por los algoritmos transversales.
Desventajas del patrón de iterador:
Para transversales simples (como matrices o listas ordenadas), es más engorroso usar iteradores, y todos pueden sentir que, como ArrayList, preferiríamos usar los bucles y obtener métodos para atravesar la colección.
Escenarios aplicables para el modo iterador
El patrón de iterador es simbiótico y muerte con la colección. Si queremos implementar un contenedor tan nuevo, por supuesto, también necesitamos introducir un patrón de iterador para implementar un iterador para nuestro contenedor.
Sin embargo, dado que la relación entre contenedores y iteradores es demasiado cercana, la mayoría de los idiomas proporcionan iteradores al implementar contenedores, y los contenedores y los iteradores proporcionados por estos idiomas pueden satisfacer nuestras necesidades en la mayoría de los casos, es relativamente raro practicar el patrón de iteradores por nosotros mismos.