padrão iterator

Download Padrão Iterator

Post on 26-May-2015

815 views

Category:

Technology

3 download

Embed Size (px)

DESCRIPTION

Aula sobre o Padrão Iterator do GoF

TRANSCRIPT

  • 1. Iterator

2. Iterator Motivao 2 Restaurantes diferentes Unificao de empresas Cada uma possui um cardpio diferente Uma especializada em Cafs da Manh A PanquecariaOutra em Almoos O Restaurante 3. 2 Colees de Objetos 4. O Item de Menu A classe que representa cada item de menu igual nas 2 lojas 5. Os Menus Semelhantes Os menus so semelhantesDiferena A armazenagem dos objetos ItemDeMenu 6. O Menu do Restaurante 7. MenuDoRestaurante.java public class MenuDoRestaurante { static final int MAX_ITEMS = 6; int numeroDeItens = 0; ItemDeMenu[] itensDeMenu; public ItemDeMenu[] getItensDeMenu() { return itensDeMenu; } public void adicionarItem( String nome, String descricao, boolean vegetariano, double preco) { ItemDeMenu itemDeMenu = new ItemDeMenu(nome, descricao, vegetariano, preco); if (numeroDeItens >= MAX_ITEMS) { System.out.println("Menu est cheio"); } else { itensDeMenu[numeroDeItens] = itemDeMenu; numeroDeItens++; } } public MenuDoRestaurante() { itensDeMenu = new ItemDeMenu[MAX_ITEMS]; adicionarItem("Canja", "Canja", false, 3.99); adicionarItem("Waffles", "Waffles", true, 3.59); } } 8. O Menu da Panquecaria 9. MenuDaPanquecaria.java public class MenuDaPanquecaria { ArrayList itensDeMenu; public ArrayList getItensDeMenu() { return itensDeMenu; } public void adicionarItem( String nome, String descricao, boolean vegetariano, double preco) { ItemDeMenu itemDeMenu = new ItemDeMenu(nome, descricao, vegetariano, preco); itensDeMenu.add(itemDeMenu); } public MenuDaPanquecaria() { itensDeMenu = new ArrayList(); adicionarItem("Panqueca Caf da Manh", "Panqueca com ovos", true, 2.99); adicionarItem("Waffles", "Waffles", true, 3.59); } } 10. Contrata-se Garonete Requisitos Deve ser capaz de interagir com menus em Java de diversas naturezas e apresent-losO Problema Ela deve saber trabalhar com Array e ArrayList 11. O que ela deve saber fazer void printMenuDaPanquecaria() { MenuDaPanquecaria menu = new MenuDaPanquecaria(); ArrayList itensPanquecaria = menu.getItensDeMenu(); for (int i = 0; i < itensPanquecaria.size(); i++) { ItemDeMenu item = (ItemDeMenu) itensPanquecaria.get(i); System.out.print(item.getNome() + " "); System.out.print(item.getPreco() + " "); System.out.println(item.getDescricao()); } } 12. O que ela deve saber fazer void printMenuDoRestaurante() { MenuDoRestaurante menu = new MenuDoRestaurante(); ItemDeMenu[] itensDoRestaurante = menu.getItensDeMenu(); for (int i = 0; i < itensDoRestaurante.length; i++) { ItemDeMenu item = itensDoRestaurante[i]; System.out.print(item.getNome() + " "); System.out.print(item.getPreco() + " "); System.out.println(item.getDescricao()); } } 13. Breve anlise Verdadeiro ou Falso? Estamos codificando para implementaes concretas de MenuDoRestaurante e MenuDaPanquecaria e no para uma interface Se quisssemos passar a usar um outro tipo de Menu que implemente sua lista de itens atravs de Hashtable, teramos que modificar o cdigo da Garonete A Garonete precisa saber como cada menu representa a sua coleo interna de itens, o que viola o encapsulamento Temos cdigo duplicado: o mtodo printMenu() exige dois laos separados para iterar atravs dos dois tipos de menus. Se acrescentarmos um terceiro menu, teramos mais um lao 14. Relembrando o 1. Princpio de DesignIdentifique os aspectos de seu aplicativo que variam e separe-os do que permanece igual 15. O qu est variando? 16. A iteraoget(1) get(0)get(2)get(3) 17. A 2. iterao[0][1] [2][3] 18. Encapsulando a iteraonext()[0][1][3] [2] 19. Encapsulando a iteraonext()get(3) get(0)get(1)get(2) 20. O Padro Iterator Encapsular o que varia Encapsule a iterao 21. Temos a interface Precisamos dos Objetos 22. IteratorRestauranteMenu.java 23. IteratorRestauranteMenu.java public class IteratorRestauranteMenu implements Iterator { ItemDeMenu[] itens; int posicao = 0; public IteratorRestauranteMenu(ItemDeMenu[] itens) { this.itens = itens; } public boolean hasNext() { if (posicao >= itens.length || itens[posicao] == null) { return false; } else { return true; } } public Object next() { ItemDeMenu item = itens[posicao]; posicao = posicao + 1; return item; } } 24. No MenuDoRestaurante Adicione o mtodo criarIterator()//Este mtodo no mais necessrio /* public ItemDeMenu[] getItensDeMenu() { return itensDeMenu; } */ public Iterator criarIterator() { return new IteratorRestauranteMenu(itensDeMenu); } 25. Exerccio Fazer o mesmo processo para o MenuDaPanquecaria Criar o Iterator Adicionar o mtodo criarIterator 26. Garonete Ainda precisaramos de 2 mtodos para percorrer as 2 colees? 27. A Garconete refatorada public void printMenu(Iterator iterator) { while(iterator.hasNext()) { ItemDeMenu item = (ItemDeMenu) iterator.next(); System.out.print(item.getNome() + " "); System.out.print(item.getPreco() + " "); System.out.println(item.getDescricao()); } } public void printMenu() { Iterator panquecaIterator = menuDaPanquecaria.criarIterator(); Iterator restauranteIterator = menuDoRestaurante.criarIterator(); System.out.println("MENUn --nCaf da Manh"); printMenu(panquecaIterator); System.out.println("nAlmoo"); printMenu(restauranteIterator); } 28. + 1 Padro ITERATOR O Padro Iterator fornece uma maneira de acessar seqencialmente os elementos de um objeto agregado sem expor a sua representao subjacente. 29. Diagrama de classes 30. Participantes Iterator Iterator Concreto O Iterator concreto responsvel por gerenciar o posio atual da iteraoAgregado Fornece a interface que todos os iterators devem implementar e o conjunto de mtodos para percorrer todos os elementos de uma coleoUma interface comum para objetos agregados Desacopla o cliente da implementao da sua coleo de objetosAgregado Concreto Possui uma coleo de objetos Implementa o mtodo que retorna um Iterator para esta coleo 31. Responsabilidade nica Uma classe s deve ter uma nica razo para mudar 32. Coeso Alta coeso Conjunto de funes relacionadas entre siBaixa coeso Funes dspares