Ybadoo - Soluções em Software Livre
Tutoriais
Programação Orientada a Objetos

Slides

Exemplo do padrão de projeto Adapter por fluffycat, tutorialspoint ou Wikipédia.

Exemplo do padrão de projeto Bridge por fluffycat, tutorialspoint ou Wikipédia.

Exemplo do padrão de projeto Composite por fluffycat, tutorialspoint ou Wikipédia.

Exemplo do padrão de projeto Decorator por fluffycat, tutorialspoint ou Wikipédia.

Exemplo do padrão de projeto Façade por fluffycat, tutorialspoint ou Wikipédia.

Exemplo do padrão de projeto Flyweight por fluffycat, tutorialspoint ou Wikipédia.

Exemplo do padrão de projeto Proxy por fluffycat, tutorialspoint ou Wikipédia.

Exercício 09.01 O que é uma classe adaptadora (Sintes, 2002)?

Exercício 09.02 Qual problema o padrão Adapter resolve (Sintes, 2002)?

Exercício 09.03 Por que você usaria o padrão Adapter (Sintes, 2002)?

Exercício 09.04 Qual problema o padrão Bridge resolve?

Exercício 09.05 Por que você usaria o padrão Bridge?

Exercício 09.06 Qual problema o padrão Composite resolve?

Exercício 09.07 Por que você usaria o padrão Composite?

Exercício 09.08 Qual problema o padrão Decorator resolve?

Exercício 09.09 Por que você usaria o padrão Decorator?

Exercício 09.10 Qual problema o padrão Façade resolve?

Exercício 09.11 Por que você usaria o padrão Façade?

Exercício 09.12 Qual problema o padrão Flyweight resolve?

Exercício 09.13 Por que você usaria o padrão Flyweight?

Exercício 09.14 Qual problema o padrão Proxy resolve (Sintes, 2002)?

Exercício 09.15 Por que você usaria o padrão Proxy (Sintes, 2002)?

Exercício 09.16 A Sun Microsystems, IBM e Apache fornecem bibliotecas para analisar documentos XML. Você optou por usar a biblioteca Apache em seu aplicativo XML. No futuro, contudo, você poderia optar por usar um fornecedor diferente. Qual padrão de projeto você usaria e por que (Sintes, 2002)?

Exercício 09.17 Você deve escrever um aplicativo que recupere dados de um armazém de dados baseado em arquivo. Às vezes, seu aplicativo será executado de forma local e poderá acessar o armazém de dados através de meios diretos. Outras vezes, o cliente será executado de forma remota e precisará se comunicar com um servidor para ler o armazém de dados. Qual padrão de projeto você usaria e por que (Sintes, 2002)?

Exercício 09.18 O padrão Proxy altera a interface de um objeto (Sintes, 2002)?

Exercício 09.19 Forneça as classes decoradoras EncryptingWriter e DecryptingReader que codificam e decodificam os caracteres do leitor ou gravador que estiver por trás. Garanta que essas classes são também leitores e gravadores, de maneira que seja possível acrescentar novas decorações. Para a codificação, use o Caesar cipher, que desloca o alfabeto de três caracteres (isto é, A se transforma em D, B se transforma em E, e assim por diante) (Horstmann, 2007).

Exercício 09.20 Para exercitar a utilização do padrão de projeto Composite, desenvolva uma interpretador de expressões aritméticas. A expressão aritmética (Component) deverá ter um método para resolver a expressão, retornando o seu valor numérico. As constantes numéricas (Leaf) retornarão o seu próprio valor, por exemplo, a contante numérica 5 retornará o valor 5. As operações (Composite) retornarão o valor da operação, no formato operando operador operando.

Exercício 09.21 Para exercitar a utilização do padrão de projeto Flyweight, desenvolva um cache de Unidades da Federação (UF). A interface Localidade (Flyweight) declara uma interface da qual as localidades podem receber e atuar sobre seus atributos. A classe Unidade da Federação (ConcreteFlyweight) implementa a interface Localidade e armazena o estado de uma Unidade da Federação. A classe Cache (FlyweightFactory) deve criar e gerenciar as Unidades da Federação, garantindo que as Localidades sejam compartilhadas apropriadamente. A classe Cliente (Client) mantém uma referência para o Cache e solicita ao mesmo as instâncias das Unidades da Federação desejados.

Exercício 09.22 A classe java.util.Map da API de coleções de Java permite que sejam armazenados pares de objetos (chave e valor) em uma de suas implementações (as mais conhecidas são HashMap e TreeMap). No entanto, estas classes não possuem um construtor que receba como parâmetro uma matriz de duas linhas e que monte o mapa usando a primeira linha como chave e a segunda como coluna. Desenvolva um adaptador (dica: use Adapter de classe) que tenha este construtor.

Exercício 09.23 Desenvolva uma classe chamada PlatonicSolid para representar um Sólido Platônico. A classe possui um único atributo denominado length, que representa o comprimento da aresta do Sólido Platônico, do tipo int e cujo valor deve ser maior ou igual a um. A classe possui um único construtor, que recebe como parâmetro o comprimento da aresta do Sólido Platônico. O comprimento da aresta do Sólido Platônico pode ser obtido pelo usuário por meio do método getLength(). A quantidade de faces, arestas e vértices do Sólido Platônico podem ser obitos pelo usuário por meio dos métodos getFaces(), getEdges() e getVertices(), respectivamente. A classe também apresenta os métodos area() e volume(), que retornam a área e o volume do Sólido Platônico, respectivamente. Estenda a classe PlatonicSolid para implementar uma classe chamada Tetrahedron para representar um tetraedro, ou seja, um poliedro regular de quatro faces, considerado um dos cinco Sólidos Platônicos. Um tetraedro possui quatro faces, seis arestas e quatro vértices. A área de um tetraedro de aresta a é obtida pela fórmula √3 * a2. O volume de um tetraedro de aresta a é obtida pela fórmula √2 / 12 * a3. Estenda a classe PlatonicSolid para implementar uma classe chamada Hexahedron para representar um hexaedro, ou seja, um poliedro regular de seis faces, considerado um dos cinco Sólidos Platônicos. Um hexaedro possui seis faces, doze arestas e oito vértices. A área de um hexaedro de aresta a é obtida pela fórmula 6 * a2. O volume de um hexaedro de aresta a é obtida pela fórmula a3. Estenda a classe PlatonicSolid para implementar uma classe chamada Octahedron para representar um octaedro, ou seja, um poliedro regular de oito faces, considerado um dos cinco Sólidos Platônicos. Um octaedro possui oito faces, doze arestas e seis vértices. A área de um octaedro de aresta a é obtida pela fórmula 2 * √3 * a2. O volume de um octaedro de aresta a é obtida pela fórmula √2 / 3 * a3. Estenda a classe PlatonicSolid para implementar uma classe chamada Dodecahedron para representar um dodecaedro, ou seja, um poliedro regular de doze faces, considerado um dos cinco Sólidos Platônicos. Um dodecaedro possui doze faces, trinta arestas e vinte vértices. A área de um dodecaedro de aresta a é obtida pela fórmula 3 * √(25 + 10 * √5) * a2. O volume de um dodecaedro de aresta a é obtida pela fórmula 1 / 4 * (15 + 7 * √5) * a3. Estenda a classe PlatonicSolid para implementar uma classe chamada Icosahedron para representar um icosaedro, ou seja, um poliedro regular de vinte faces, considerado um dos cinco Sólidos Platônicos. Um icosaedro possui vinte faces, trinta arestas e doze vértices. A área de um icosaedro de aresta a é obtida pela fórmula 5 * √3 * a2. O volume de um icosaedro de aresta a é obtida pela fórmula 5 / 12 * (3 + √5) * a3. Desenvolva uma classe chamada PlatonicSolidCache para representar um cache de sólidos platônicos, permitindo que os mesmos sejam compartilhados apropriadamente pela aplicação. Utilize o padrão de projeto Flyweight para auxiliar no desenvolvimento da solução.

Exercício 09.24 Um texto é constituído por palavras. Quando o texto é apresentado, através do método render, cada palavra pode aparecer sem qualquer modificação de aspecto (utiliza-se o método render correspondente). É ainda possível modificar dinamicamente o aspecto das palavras, permitindo que sejam apresentadas em negrito, itálico e sublinhado, ou ainda em combinações variadas, como por exemplo, negrito e itálico ou itálico sublinhado. No entanto, a apresentação é sempre realizada da mesma forma, através do método render.

  1. Qual o padrão de projeto mais adequado para ser usado no desenvolvimento deste sistema?
  2. Apresente o diagrama de classes em UML da solução proposta.
  3. Apresente a codificação na linguagem de programação Java da solução proposta.

Exercício 09.25 Aplicações costumam utilizar arquivos de propriedades para o armazenamento de suas configurações, como por exemplo, o endereço do banco de dados utilizado pela aplicação, o login e a senha de acesso ao respectivo banco de dados, o layout padrão da aplicação, o idioma padrão e assim por diante. As informações no arquivo de propriedades são armazenadas no formato chave=valor, com cada par de informação ocupando uma respectiva linha, como por exemplo:
database=jdbc:postgresql://localhost:5432/ybadoo
user=root
password=123456

Empregando o padrão de projeto Proxy, desenvolva uma aplicação que carregue para a memória os registros contidos no arquivo de propriedades, de forma que a aplicação não precise abrir/fechar o arquivo para a recuperação de cada informação. Para verificar o funcionamento do padrão de projeto Proxy, apresente a execução da aplicação com e sem a utilização do Proxy, informando ao usuário cada abertura/fechamento do arquivo de propriedades.

Exercício 09.26 Quando uma abstração pode ter uma entre várias implementações possíveis, a maneira usual de acomodá-las é usando a herança. Uma classe abstrata define a interface para a abstração, e subclasses concretas a implementam de formas diferentes. Mas essa abordagem nem sempre é suficientemente flexível. A herança liga uma implementação à abstração permanentemente, o que torna difícil modificar, aumentar e reutilizar abstrações e implementações independentemente. Empregando o padrão de projeto Bridge, desenvolva um sistema estatístico que permita ao usuário selecionar o método a ser utilizado para o calculo da média de uma série de números, que podem ser fornecidos pelo usuário por meio de um vetor, uma matriz, uma lista dentre diversas outras formas.

Exercício 09.27 Para exercitar a utilização do padrão de projeto Composite, desenvolva um programa que apresente a somatória dos elementos armazenados num vetor, numa matriz e/ou num cubo.

Exercício 09.28 Uma lanchonete deseja implementar um sistema onde o usuário pode personalizar o seu cachorro-quente, inserindo adicionais ao produto base, como milho, queijo, cebola e assim por diante.

Os cachorros-quentes comercializados pela lanchonete são:

Tradicional (pão, molho de tomate e salsicha tradicional)     R$ 6,00
Especial (pão, molho de tomate e salsicha especial) R$ 7,00
Frango (pão, molho de tomate e salsicha de frango) R$ 7,80
Calabresa (pão, molho de tomate e salsicha calabresa) R$ 7,80

Os acompanhamentos que podem ser adicionados a qualquer um dos cachorros-quentes comercializados pela lanchonete são:

Cebola      R$ 0,30
Milho R$ 0,50
Ervilha R$ 0,50
Queijo R$ 0,70
Bacon R$ 0,70

Por exemplo, caso o cliente selecione o tradicional + milho + queijo + bacon o sistema deverá informar ao cliente na nota fiscal:

Tradicional (pão, molho de tomate e salsicha tradicional)     R$ 6,00
Milho R$ 0,50
Queijo R$ 0,70
Bacon R$ 0,70
TOTAL R$ 7,90

Desenvolva o sistema solicitado, utilizando o padrão de projeto Decorator.

Exercício 09.29 As classes java.util.ArrayList<E> e java.util.LinkedList<E> permitem o manuseio de uma lista de objetos de forma mais fácil do que a implementada por um array de objetos. No entanto, estas classes não possuem um construtor que receba como parâmetro um array de objetos e inicialize a lista de objetos com tais valores, dificultando a migração dos sistemas legados que ainda utilizam arrays de objetos. Desenvolva um adaptador para essas classes, que permita a inicialização da lista de objetos por meio de um array de objetos, como o implementado pela classe java.util.CopyOnWriteArrayList<E>.