Os Padrões Iterator e Composite
235
9. Os Padrões Iterator e Composite
Coleções Bem Administradas
Existem muitas maneiras de agrupar objetos numa
coleção. A escolha é sua: você pode colocá-los numa Matriz,
numa Pilha, numa Lista ou numa Hashtable (tabela mista). Cada
uma destas opções tem suas vantagens e desvantagens. Mas
em algum ponto o seu cliente terá que iterar com esses objetos;
quando isso acontecer, você lhe mostrará a sua implementação?
Certamente esperamos que não! Isto seria muito pouco
prossional. Bem, você não precisa arriscar sua carreira, porque
agora mostraremos como você pode permitir que seus clientes
realizem a iteração com seus objetos sem ter a mínima idéia de
como eles são armazenados. Você aprenderá também a criar
uma supercoleção de objetos para poder atravessar algumas
estruturas de dados altamente complexas com um único salto.
E, como se não fosse bastante, você aprenderá também uma
ou duas coisas sobre a responsabilidade dos objetos.
É claro que mantenho
todas as minhas coleções
bem encapsuladas!
CG_ucpadroes_RI2016.indb 235 22/11/2016 09:36:39
Use a Cabeça Padrões de Projetos
236
Notícias: Fusão do Restaurante Objetolândia com a Panqueca-
ria Objetolândia
Esta é uma ótima notícia! Agora podemos comer aquelas panquecas deliciosas da Panquecaria no café da manhã e saborear aqueles
fartos almoços do Restaurante num único lugar. Mas parece haver um pequeno problema…
Examinando os Itens do Menu
Pelo menos Lou e Mel concordam com a implementação dos
itens de menu em MenuItems. Vamos examinar os itens de cada
menu e a forma como estes foram implementados.
O cardápio do Restaurante oferece opções de
refeições, enquanto o da Panquecaria oferece
opções de café da manhã. Cada item do menu
possui um nome, uma descrição e um preço.
Eles querem usar o cardápio da
minha Panquecaria no café da
manhã e o cardápio do Restaurante
no almoço. Concordamos em
implementar esses itens no menu...
… mas não conseguimos chegar a um acordo
sobre como fazer essa implementação.
Aquele sujeito ali usava um ArrayList para
armazenar seus itens de menu, enquanto eu
usava uma matriz. Nenhum de nós concorda
em mudar a sua implementação… Temos um
grande volume de código dependendo delas.
Mel
Lou
CG_ucpadroes_RI2016.indb 236 22/11/2016 09:36:39
Os Padrões Iterator e Composite
237
public class MenuItem {
String name;
String description;
boolean vegetarian;
double price;
public MenuItem(String name,
String description,
boolean vegetarian,
double price)
{
this.name = name;
this.description = description;
this.vegetarian = vegetarian;
this.price = price;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public double getPrice() {
return price;
}
public boolean isVegetarian() {
return vegetarian;
}
}
As Implementações de Menus de Lou e Mel
Agora vamos ver por que Lou e Mel estão discutindo tanto. Ambos investiram muito
tempo e trabalho para codicar a maneira como seus itens de menu são armazenados,
bem como todos os outros trechos de código que dependem dessas informações.
public class PancakeHouseMenu {
ArrayList menuItems;
public PancakeHouseMenu() {
menuItems = new ArrayList();
addItem(“K&B’s Pancake Breakfast”,
“Pancakes with scrambled eggs, and toast”,
true,
Estes métodos de
recuperação permitem que
você acesse os campos do
item de menu.
Esta é a implementação de Lou para
o menu da sua Panquecaria.
Lou está usando um ArrayList para
armazenar seus itens de menu.
Um item de menu consiste em um nome, uma
descrição, um sinalizador que indica se o item é
vegetariano e um preço. Todos esses valores são
passados ao construtor para inicializar o item
de menu.
Eu usei um ArrayList
para poder expandir
facilmente o meu menu.
CG_ucpadroes_RI2016.indb 237 22/11/2016 09:36:39
Use a Cabeça Padrões de Projetos
238
2.99);
addItem(“Regular Pancake Breakfast”,
“Pancakes with fried eggs, sausage”,
false,
2.99);
addItem(“Blueberry Pancakes”,
“Pancakes made with fresh blueberries”,
true,
3.49);
addItem(“Waes”,
“Waeswithyourchoiceofblueberriesorstrawberries”,
true,
3.59);
}
public void addItem(String name, String description,
boolean vegetarian, double price)
{
MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
menuItems.add(menuItem);
}
public ArrayList getMenuItems() {
return menuItems;
}
// outros métodos de menu aqui
}
Os itens de menu são acrescentados
ao ArrayList aqui, no construtor.
Cada item possui um nome, uma
descrição, uma indicação de se é ou
não vegetariano e um preço.
Para inserir um item de menu, Lou cria
um novo objeto MenuItem, passando a
ele todos os argumentos, e em seguida
acrescenta esse objeto ao ArrayList.
Ah-ah! Um ArrayList... Eu usei uma
Matriz REAL para poder controlar
o tamanho máximo do menu e para
recuperar meus itens de menu sem
ter que usar um molde.
O método getMenuItems() retorna
a lista de itens do menu.
Lou usa também outros blocos de código que
dependem da implementação de ArrayList. Ele
não quer ter que reescrever todo esse código!
CG_ucpadroes_RI2016.indb 238 22/11/2016 09:36:39
Get Use A Cabeça Padrões E Projetos now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.