23 Patrones de diseño, Capítulo 14: Patrón de iterador de Java
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. Echemos un vistazo a un pedazo de código primero:
Public static void print (colección colla) {iterator it = coll.iterator (); while (it.hasnext ()) {string str = (string) it.next (); System.out.println (str); }}La función de este método es imprimir un bucle de recolección de cadenas, y el patrón de iterador se usa en el patrón de iterador. El lenguaje Java ha implementado completamente el patrón Iterator. Iterador traducido al iterador chino. Cuando se trata de iteradores, en primer lugar, está relacionado con conjuntos. Los conjuntos también se llaman agregados, contenedores, etc. Podemos considerar los conjuntos como contenedores que pueden contener objetos. Por ejemplo, la lista, el conjunto, el mapa e incluso las matrices se pueden llamar conjuntos. La función de los iteradores es atravesar los objetos en el contenedor uno por uno.
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: definir el método requerido para atravesar elementos. En términos generales, hay tres métodos: obtener el primer método () del primer elemento, obtener el método Next () del siguiente elemento, determine si el método de transversal termina isDone () (o hasNext ()), eliminar () del objeto actual,
Implementación del iterador: implementa los métodos definidos en la interfaz iteradora para completar la iteración de la colección.
Implementación del código
Interface Iterator {Public Object Next (); Public Boolean Hasnext (); } class ConcreteIterator implementa Iterator {private list list = new ArrayList (); privado int cursor = 0; Public ConcreteIterator (lista de listas) {this.list = list; } public boolean HasNext () {if (cursor == list.size ()) {return false; } return verdadero; } objeto público next () {object obj = null; if (this.hasnext ()) {obj = this.list.get (cursor ++); } return obj; }} interfaz agregado {public void add (objeto obj); Public void eliminar (obj obj); Public Iterator Iterator (); } class ConcreteAgregate Implements agregado {private list list = new ArrayList (); public void add (object obj) {list.add (obj); } public Iterator Iterator () {return New ConcreteIterator (lista); } public void remove (object obj) {list.remove (obj); }} Cliente de clase pública {public static void main (string [] args) {agregate ag = new ConcreteAgageGREGate (); AG.Add ("Xiaoming"); ag.add ("xiaohong"); AG.Add ("Xiaogang"); Iterador it = ag.iterator (); while (it.hasnext ()) {string str = (string) it.next (); System.out.println (str); }}} En el código anterior, Aggregate es la interfaz de la clase de contenedor. Puede imaginar la colección, lista, conjunto, etc. El agregado es su versión simplificada. Existen tres métodos principales en la interfaz de clase de contenedor: Agregar método de objeto Agregar, Eliminar el método de objeto Eliminar y obtener el iterador del método Iterator. Iterator es una interfaz iteradora, que tiene dos métodos principales: obtener el método de objeto iterativo a continuación y determinar si para iterar el método Hasnext. Puede comparar las dos interfaces de java.util.list y java.util.iterator para pensarlo usted mismo.
Ventajas del modo iterador:
El método transversal se ha simplificado, y todavía es bastante problemático atravesar la colección de objetos. Para matrices o listas ordenadas, aún podemos obtenerlas a través de los cursores, pero los usuarios deben atravesar los objetos por sí mismos con la premisa de que tienen una comprensión clara de la colección. Sin embargo, para la tabla hash, es más problemático atravesar al usuario. Después de introducir el método Iterator, es mucho más fácil de usar para los usuarios.
Hay muchas formas de atravesar, como para las listas ordenadas, podemos proporcionar a dos iteradores orden positivo y recorrido de orden inverso de acuerdo con las necesidades. Los usuarios solo necesitan obtener el iterador que implementamos para atravesar fácilmente la colección.
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. En términos generales, mientras implementemos una colección, necesitamos proporcionar el iterador de la colección al mismo tiempo, al igual que la colección, la lista, el set, el mapa, etc. En Java, estas colecciones tienen sus propios iteradores. 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 e iteradores proporcionados por estos idiomas pueden satisfacer nuestras necesidades en la mayoría de los casos. Por lo tanto, es relativamente raro practicar el patrón iterador por nosotros mismos. Solo necesitamos usar los contenedores e iteradores existentes en el idioma.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.