23 Padrões de design, capítulo 14: Java Iterator Pattern
Definição: fornece um método para acessar vários elementos em um objeto de contêiner sem expor os detalhes internos do objeto.
Tipo: padrão comportamental
Diagrama de classe:
Se você deseja perguntar o modo mais usado em Java, a resposta não é o modo Singleton, nem o modo de fábrica, nem o modo de estratégia, mas o modo iterador. Vamos dar uma olhada em um pedaço de código primeiro:
public static void Print (coleção coll) {iterator it = col.iterator (); while (it.hasnext ()) {string str = (string) it.Next (); System.out.println (str); }}A função desse método é imprimir um loop de coleção de string, e o padrão do iterador é usado no padrão do iterador. O idioma Java implementou totalmente o padrão do iterador. O iterador traduzido para o chinês significa iterador. Quando se trata de iteradores, antes de tudo, ele está relacionado a conjuntos. Os conjuntos também são chamados de agregados, contêineres, etc. Podemos considerar conjuntos como contêineres que podem conter objetos. Por exemplo, listar, definir, mapa e até matrizes podem ser chamados de conjuntos. A função dos iteradores é atravessar os objetos no contêiner um por um.
A estrutura do padrão do iterador
Contêiner de resumo: Geralmente, o método iterator () é fornecido, como interface de coleta, interface de lista, interface definida, etc. em java.
Contêiner específico: é a classe de implementação concreta de contêineres abstratos, como a lista ordenada da interface da lista para implementar a ArrayList, a lista vinculada da interface da lista para implementar o LinkList, a lista de hash da interface definida para implementar hashset, etc.
Resumo Iterador: Defina o método necessário para atravessar elementos. De um modo geral, existem três métodos: obtenha o primeiro () método () do primeiro elemento, obtenha o método Next () do próximo elemento, determine se o método de travessal termina Isdone () (ou hasNext ()), remova () do objeto atual,
Implementação do iterador: implementa os métodos definidos na interface do iterador para concluir a iteração da coleção.
Implementação de código
interface iterator {public objeto a seguir (); Public Boolean HasNext (); } classe concreteIterator implementa o iterador {lista privada list = new ArrayList (); private int cursor = 0; public concreteIterator (lista de lista) {this.list = list; } public boolean hasNext () {if (cursor == list.size ()) {return false; } retornar true; } public objeto a seguir () {objeto obj = null; if (this.hasnext ()) {obj = this.list.get (cursor ++); } retornar obj; }} interface agregada {public void add (objeto obj); Public void remover (objeto obj); iterator público iterator (); } classe concretegegregate implementos agregados {lista privada list = new ArrayList (); public void add (object obj) {list.add (obj); } public iterator iterator () {return new concreteIterator (list); } public void remover (objeto obj) {list.remove (obj); }} public classe client {public static void main (string [] args) {agregate ag = new concretegregregate (); ag.add ("xiaoming"); ag.add ("xiaohong"); ag.add ("xiaogang"); Iterator it = ag.iterator (); while (it.hasnext ()) {string str = (string) it.Next (); System.out.println (str); }}} No código acima, o agregado é a interface da classe de contêineres. Você pode imaginar coleção, listagem, conjunto, etc. O agregado é a versão simplificada. Existem três métodos principais na interface da classe de contêineres: adicione o método do objeto Adicionar, excluir o método do objeto Remover e obter o iterador do método do iterador. O iterador é uma interface do iterador, que possui dois métodos principais: obtenha o método de objeto iterativo a seguir e determine se itera o método Hasnext. Você pode comparar as duas interfaces de java.util.list e java.util.iterator para pensar sobre isso você mesmo.
Vantagens do modo iterador:
O método Traversal foi simplificado e ainda é bastante problemático atravessar a coleção de objetos. Para matrizes ou listas ordenadas, ainda podemos obtê -las através de cursores, mas os usuários precisam atravessar os objetos por si mesmos com a premissa de que têm um entendimento claro da coleção. No entanto, para a tabela de hash, é mais problemático atravessar o usuário. Depois de introduzir o método do iterador, é muito mais fácil para os usuários usar.
Existem muitas maneiras de atravessar, como para listas ordenadas, podemos fornecer a dois iteradores com ordem positiva e de ordem reversa de travessia de acordo com as necessidades. Os usuários precisam apenas obter o iterador que implementamos para atravessar facilmente a coleção.
O encapsulamento é bom e os usuários precisam apenas de um iterador para atravessar, mas não precisam se preocupar com algoritmos de travessia.
Desvantagens do padrão do iterador:
Para travessias simples (como matrizes ou listas ordenadas), é mais pesado usar iteradores, e todos podem sentir que, como a Arraylist, preferimos usar em loops e obter métodos para atravessar a coleção.
Cenários aplicáveis para o modo iterador
O padrão do iterador é simbiótico e a morte com a coleção. De um modo geral, desde que implementemos uma coleção, precisamos fornecer o iterador da coleção ao mesmo tempo, assim como coleção, lista, conjunto, mapa etc. Em Java, essas coleções têm seus próprios iteradores. Se queremos implementar um novo contêiner, é claro que também precisamos introduzir um padrão de iterador para implementar um iterador para o nosso contêiner.
No entanto, como a relação entre contêineres e iteradores está muito próxima, a maioria dos idiomas fornece iteradores ao implementar contêineres, e os contêineres e iteradores fornecidos por esses idiomas podem atender às nossas necessidades na maioria dos casos. Portanto, é relativamente raro praticar o padrão de iterador por nós mesmos. Precisamos usar apenas os contêineres e iteradores existentes no idioma.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.