SlideShare una empresa de Scribd logo
1 de 32
Descargar para leer sin conexión
Iterator
Iterator
 
 
 
 
 

Motivação
2 Restaurantes diferentes
Unificação de empresas
Cada uma possui um cardápio diferente
Uma especializada em Cafés da Manhã
 

 

A Panquecaria

Outra em Almoços
 

O Restaurante
2 Coleções de Objetos
 
O Item de Menu
 

A classe que representa cada item de menu é
igual nas 2 lojas
Os Menus
Semelhantes
 

Os menus são semelhantes

 

Diferença
 

A armazenagem dos objetos ItemDeMenu
O Menu
do Restaurante
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);
}
}
O Menu
da Panquecaria
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);
}
}
Contrata-se
Garçonete
 

Requisitos
 

 

Deve ser capaz de interagir com
menus em Java de diversas
naturezas e apresentá-los

O Problema
 

Ela deve saber trabalhar com Array
e ArrayList
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());
}
}
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());
}
}
Breve análise
Verdadeiro ou Falso?
 

 

 

 

Estamos codificando para implementações
concretas de MenuDoRestaurante e
MenuDaPanquecaria e não para uma interface
Se quiséssemos passar a usar um outro tipo de
Menu que implemente sua lista de itens através de
Hashtable, teríamos que modificar o código da
Garçonete
A Garçonete precisa saber como cada menu
representa a sua coleção interna de itens, o que
viola o encapsulamento
Temos código duplicado: o método printMenu()
exige dois laços separados para iterar através dos
dois tipos de menus. Se acrescentarmos um terceiro
menu, teríamos mais um laço
Relembrando o 1.º
Princípio de Design

“Identifique os aspectos de seu aplicativo
que variam e separe-os
do que permanece igual”
O quê está
variando?
A iteração

get(1)
get(0)

get(2)

get(3)
A 2.ª iteração

[0]

[1]
[2]

[3]
Encapsulando
a iteração

next()

[0]

[1]

[3]
[2]
Encapsulando
a iteração

next()

get(3)
get(0)

get(1)

get(2)
O Padrão Iterator
 

Encapsular o que varia
 

Encapsule a iteração
Temos a interface
Precisamos dos Objetos
IteratorRestauranteMenu.java
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;
}
}
No MenuDoRestaurante
 

Adicione o método criarIterator()

//Este método não é mais necessário
/*
public ItemDeMenu[] getItensDeMenu() {
return itensDeMenu;
}
*/
public Iterator criarIterator() {
return new IteratorRestauranteMenu(itensDeMenu);
}
Exercício
 

Fazer o mesmo processo para o
MenuDaPanquecaria
 
 

Criar o Iterator
Adicionar o método criarIterator
Garçonete
 

Ainda precisaríamos de 2 métodos para
percorrer as 2 coleções?
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("nAlmoço");
printMenu(restauranteIterator);
}
+ 1 Padrão
ITERATOR
O Padrão Iterator fornece uma maneira de
acessar seqüencialmente os elementos de
um objeto agregado sem expor a sua
representação subjacente.
Diagrama de classes
Participantes
 

Iterator
 

 

Iterator Concreto
 

 

O Iterator concreto é responsável por gerenciar o posição atual da
iteração

Agregado
 
 

 

Fornece a interface que todos os iterators devem implementar e o
conjunto de métodos para percorrer todos os elementos de uma
coleção

Uma interface comum para objetos agregados
Desacopla o cliente da implementação da sua coleção de objetos

Agregado Concreto
 
 

Possui uma coleção de objetos
Implementa o método que retorna um Iterator para esta coleção
Responsabilidade Única
 

Uma classe só deve ter uma única razão para
mudar
Coesão
 

Alta coesão
 

 

Conjunto de funções relacionadas entre si

Baixa coesão
 

Funções díspares

Más contenido relacionado

La actualidad más candente

La actualidad más candente (7)

Java AWT
Java AWTJava AWT
Java AWT
 
Java gui
Java guiJava gui
Java gui
 
Apresentação-Resumo sobre o Java Swing.
Apresentação-Resumo sobre o Java Swing.Apresentação-Resumo sobre o Java Swing.
Apresentação-Resumo sobre o Java Swing.
 
Java12
Java12Java12
Java12
 
Bloco 5.3
Bloco 5.3Bloco 5.3
Bloco 5.3
 
Hooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressHooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPress
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 

Destacado

Padrao de projeto iterator
Padrao de projeto iteratorPadrao de projeto iterator
Padrao de projeto iteratorAlvaro Oliveira
 
Strategy - Padrões de Projeto
Strategy - Padrões de ProjetoStrategy - Padrões de Projeto
Strategy - Padrões de ProjetoEduardo Mendes
 
Exemplos de Design Patterns em Java
Exemplos de Design Patterns em JavaExemplos de Design Patterns em Java
Exemplos de Design Patterns em Javaalexmacedo
 
Introducao - Engenharia de Software
Introducao - Engenharia de SoftwareIntroducao - Engenharia de Software
Introducao - Engenharia de SoftwareEduardo Mendes
 
G gpcwmlguth 02.009.030.004-video_dvr_-_internet
G gpcwmlguth 02.009.030.004-video_dvr_-_internetG gpcwmlguth 02.009.030.004-video_dvr_-_internet
G gpcwmlguth 02.009.030.004-video_dvr_-_internetMessias Castro
 
Evolução de software 1 - Engenharia de Software
Evolução de software 1 - Engenharia de SoftwareEvolução de software 1 - Engenharia de Software
Evolução de software 1 - Engenharia de SoftwareEduardo Mendes
 
Desenvolvimento agil de_software
Desenvolvimento agil de_softwareDesenvolvimento agil de_software
Desenvolvimento agil de_softwareEduardo Mendes
 
Fábrica Simples - Padrões de Projeto
Fábrica Simples - Padrões de ProjetoFábrica Simples - Padrões de Projeto
Fábrica Simples - Padrões de ProjetoEduardo Mendes
 
Evolucao de software - parte 2
Evolucao de software - parte 2Evolucao de software - parte 2
Evolucao de software - parte 2Eduardo Mendes
 
Desenvolvimento web com PHP parte 4
Desenvolvimento web com PHP parte 4Desenvolvimento web com PHP parte 4
Desenvolvimento web com PHP parte 4Eduardo Mendes
 

Destacado (20)

Dao
DaoDao
Dao
 
Padrao de projeto iterator
Padrao de projeto iteratorPadrao de projeto iterator
Padrao de projeto iterator
 
Strategy - Padrões de Projeto
Strategy - Padrões de ProjetoStrategy - Padrões de Projeto
Strategy - Padrões de Projeto
 
Exemplos de Design Patterns em Java
Exemplos de Design Patterns em JavaExemplos de Design Patterns em Java
Exemplos de Design Patterns em Java
 
Html - Aula 3
Html - Aula 3Html - Aula 3
Html - Aula 3
 
Introducao - Engenharia de Software
Introducao - Engenharia de SoftwareIntroducao - Engenharia de Software
Introducao - Engenharia de Software
 
# Dvr stand alone maxstand 2 em 1
# Dvr stand alone maxstand 2 em 1# Dvr stand alone maxstand 2 em 1
# Dvr stand alone maxstand 2 em 1
 
G gpcwmlguth 02.009.030.004-video_dvr_-_internet
G gpcwmlguth 02.009.030.004-video_dvr_-_internetG gpcwmlguth 02.009.030.004-video_dvr_-_internet
G gpcwmlguth 02.009.030.004-video_dvr_-_internet
 
Prototype
PrototypePrototype
Prototype
 
Evolução de software 1 - Engenharia de Software
Evolução de software 1 - Engenharia de SoftwareEvolução de software 1 - Engenharia de Software
Evolução de software 1 - Engenharia de Software
 
Apostila `profissional cftv
Apostila `profissional cftvApostila `profissional cftv
Apostila `profissional cftv
 
Guia do cftv básico
Guia do cftv   básicoGuia do cftv   básico
Guia do cftv básico
 
Desenvolvimento agil de_software
Desenvolvimento agil de_softwareDesenvolvimento agil de_software
Desenvolvimento agil de_software
 
Fábrica Simples - Padrões de Projeto
Fábrica Simples - Padrões de ProjetoFábrica Simples - Padrões de Projeto
Fábrica Simples - Padrões de Projeto
 
Html Aula 1 Parte 1
Html  Aula 1 Parte 1Html  Aula 1 Parte 1
Html Aula 1 Parte 1
 
Html - Aula 4
Html - Aula 4Html - Aula 4
Html - Aula 4
 
Padrão Adapter
Padrão AdapterPadrão Adapter
Padrão Adapter
 
Evolucao de software - parte 2
Evolucao de software - parte 2Evolucao de software - parte 2
Evolucao de software - parte 2
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
 
Desenvolvimento web com PHP parte 4
Desenvolvimento web com PHP parte 4Desenvolvimento web com PHP parte 4
Desenvolvimento web com PHP parte 4
 

Más de Eduardo Mendes

JavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosJavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosEduardo Mendes
 
Angular JS - Fundamentos
Angular JS - FundamentosAngular JS - Fundamentos
Angular JS - FundamentosEduardo Mendes
 
Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de ProjetoEduardo Mendes
 
Introdução à Internet, Http e HTML
Introdução à Internet, Http e HTMLIntrodução à Internet, Http e HTML
Introdução à Internet, Http e HTMLEduardo Mendes
 
Estimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEstimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEduardo Mendes
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Eduardo Mendes
 
Validações no Ruby on Rails
Validações no Ruby on Rails Validações no Ruby on Rails
Validações no Ruby on Rails Eduardo Mendes
 
Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Eduardo Mendes
 
PHP básico para iniciantes
PHP básico para iniciantesPHP básico para iniciantes
PHP básico para iniciantesEduardo Mendes
 
PHP e MySQL para iniciantes
PHP e MySQL para iniciantesPHP e MySQL para iniciantes
PHP e MySQL para iniciantesEduardo Mendes
 
Introdução a Padrões de Projeto
Introdução a Padrões de ProjetoIntrodução a Padrões de Projeto
Introdução a Padrões de ProjetoEduardo Mendes
 

Más de Eduardo Mendes (20)

JavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosJavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a Objetos
 
AngularJS - Rotas
AngularJS - RotasAngularJS - Rotas
AngularJS - Rotas
 
Angular JS - Fundamentos
Angular JS - FundamentosAngular JS - Fundamentos
Angular JS - Fundamentos
 
Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de Projeto
 
Layout Fluido
Layout FluidoLayout Fluido
Layout Fluido
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 
Introdução à Internet, Http e HTML
Introdução à Internet, Http e HTMLIntrodução à Internet, Http e HTML
Introdução à Internet, Http e HTML
 
ExtJS-4
ExtJS-4ExtJS-4
ExtJS-4
 
Jquery 2
Jquery 2Jquery 2
Jquery 2
 
Jquery
JqueryJquery
Jquery
 
Estimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEstimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de Software
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2
 
Validações no Ruby on Rails
Validações no Ruby on Rails Validações no Ruby on Rails
Validações no Ruby on Rails
 
Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)
 
Padrão Command
Padrão CommandPadrão Command
Padrão Command
 
Padrão Fachada
Padrão FachadaPadrão Fachada
Padrão Fachada
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 
PHP básico para iniciantes
PHP básico para iniciantesPHP básico para iniciantes
PHP básico para iniciantes
 
PHP e MySQL para iniciantes
PHP e MySQL para iniciantesPHP e MySQL para iniciantes
PHP e MySQL para iniciantes
 
Introdução a Padrões de Projeto
Introdução a Padrões de ProjetoIntrodução a Padrões de Projeto
Introdução a Padrões de Projeto
 

Iterador de menus

  • 2. Iterator           Motivação 2 Restaurantes diferentes Unificação de empresas Cada uma possui um cardápio diferente Uma especializada em Cafés da Manhã     A Panquecaria Outra em Almoços   O Restaurante
  • 3. 2 Coleções 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 são semelhantes   Diferença   A armazenagem dos objetos ItemDeMenu
  • 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); } }
  • 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 Garçonete   Requisitos     Deve ser capaz de interagir com menus em Java de diversas naturezas e apresentá-los O 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 análise Verdadeiro ou Falso?         Estamos codificando para implementações concretas de MenuDoRestaurante e MenuDaPanquecaria e não para uma interface Se quiséssemos passar a usar um outro tipo de Menu que implemente sua lista de itens através de Hashtable, teríamos que modificar o código da Garçonete A Garçonete precisa saber como cada menu representa a sua coleção interna de itens, o que viola o encapsulamento Temos código duplicado: o método printMenu() exige dois laços separados para iterar através dos dois tipos de menus. Se acrescentarmos um terceiro menu, teríamos mais um laço
  • 14. Relembrando o 1.º Princípio de Design “Identifique os aspectos de seu aplicativo que variam e separe-os do que permanece igual”
  • 20. O Padrão Iterator   Encapsular o que varia   Encapsule a iteração
  • 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 método criarIterator() //Este método não é mais necessário /* public ItemDeMenu[] getItensDeMenu() { return itensDeMenu; } */ public Iterator criarIterator() { return new IteratorRestauranteMenu(itensDeMenu); }
  • 25. Exercício   Fazer o mesmo processo para o MenuDaPanquecaria     Criar o Iterator Adicionar o método criarIterator
  • 26. Garçonete   Ainda precisaríamos de 2 métodos para percorrer as 2 coleções?
  • 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("nAlmoço"); printMenu(restauranteIterator); }
  • 28. + 1 Padrão ITERATOR O Padrão Iterator fornece uma maneira de acessar seqüencialmente os elementos de um objeto agregado sem expor a sua representação subjacente.
  • 30. Participantes   Iterator     Iterator Concreto     O Iterator concreto é responsável por gerenciar o posição atual da iteração Agregado       Fornece a interface que todos os iterators devem implementar e o conjunto de métodos para percorrer todos os elementos de uma coleção Uma interface comum para objetos agregados Desacopla o cliente da implementação da sua coleção de objetos Agregado Concreto     Possui uma coleção de objetos Implementa o método que retorna um Iterator para esta coleção
  • 31. Responsabilidade Única   Uma classe só deve ter uma única razão para mudar
  • 32. Coesão   Alta coesão     Conjunto de funções relacionadas entre si Baixa coesão   Funções díspares