Aula 02 - Padrões de Projeto GOF, Java EE e GRASP
Aula 02 - Padrões de Projeto GOF, Java EE e GRASP
Aula 02 - Padrões de Projeto GOF, Java EE e GRASP
Suponham que haja uma fábrica de software que desenvolve diversos sistemas
para as mais variadas áreas de negócio. Sabe-se que, mesmo em áreas
aparentemente distintas ou contrastantes, grande parte os problemas já possuem
uma lução conhecida, formalmente ocumentada xaustivamente t stada,
uma z que am de roblemas recorrentes.
Esse manifesto continha algumas regras e figuras que descreviam métodos para a
construção de projetos práticos, seguros e atrativos em quaisquer escalas, desde
regiões inteiras a cidades, vizinhanças, jardins, edifícios, salas, entre outros. Cada
padrão i testado ndo eal, sendo revisado por diversos arquitetos e
engenheiros.
Alexander ez uma mportante eclaração a espeito de adrões de rojeto e
arquitetura: “Cada padrão descreve um problema que ocorre repetidas vezes em
nosso ambiente e, então, descreve o núcleo da solução para aquele problema, de
tal maneira que pode-se usar essa solução milhões de vezes sem nunca fazê-la da
mesma forma duas vezes”.
Bem, isso chamou a atenção de programadores que estavam de saco cheio de ter
que refazer várias partes do código para cada projeto. Foi então que, em 1994
quatro ngenheiros de ftware, conhecidos como The ng of Four (GoF),
resolveram compilar ibliotecas de luções para roblemas comuns de
codificação e lançaram um livro com 23 Padrões de Projeto de Software.
Factory Method: define uma interface para criar um objeto, mas deixa s
subclasses decidirem qual classe instanciar.
Singleton: garante que uma classe tenha apenas uma stância e provê um
ponto de cesso global a ela.
Pessoal, esse padrão de projeto deve ser utilizado quando houver a necessidade
de existir exatamente uma instância de uma classe e ela deverá ser acessível aos
clientes a partir de um ponto de acesso conhecido. Vamos considerar pótese
de um sistema que r balhe com diversas conexões com o banco e ados em
uma sma execução.
Uma deia lhor ria iar a t rface para s plataformas utra para s
janelas. A primeira conteria os elementos comuns das plataformas e teria classes
concretas específicas para implementar janelas em Linux, Mac, etc. A segunda
conteria os elementos comuns das janelas e teria classes concretas específicas para
implementar Janelas de Diálogo, Aviso, Erro, etc.
Pessoal, esse padrão de projeto deve ser utilizado quando se deseja representar
hierarquias parte-todo de objetos e quando se deseja que os clientes ignorem a
diferença entre composições de objetos e objetos individuais. Assim, eles ra arão
todos os objetos em uma strutura mposta iformemente. Considerem a
hipótese de uma interface gráfica composta de vários objetos.
Em muitos casos, esses objetos são mpostos de utros objetos. Uma excelente
implementação dessa interface seria, por exemplo, por meio de uma árvore,
porém tudo deve ser transparente para o cliente – ele precisa saber de nada disso.
Dessa forma, ele não deve diferenciar objetos individuais (Folhas) de outros
objetos compostos (Nós).
Pessoal, esse padrão de projeto deve ser utilizado quando se quer adicionar
responsabilidades a objetos individuais dinâmica e transparentemente, i.e., sem
afetar utros objetos. Também é utilizado quando extensões por subclasses forem
impraticáveis, tendo em vista o possível número de extensões independentes.
Considerem a hipótese de um Subway!
recém implementado. Para que ele acesse o sistema legado, pode-se utilizar o
padrão Façade para acilitar lização por io de a erface e lto nível e,
assim, não d se t ragir diretamente m o t ma mplexo.
Pessoal, esse padrão e projeto eve s r t zado quando uma plicação usa
grande mero e bjetos e s tos de rmazenamento rem altos. Deve ser
utilizado, também, quando muitos grupos de objetos puderem ser substituídos
por relativamente poucos objetos compartilhados, uma vez que os estados
extrínsicos forem removidos.
Portanto, cada caractere deve possuir uma referência para um objeto Flyweight,
que deverá ser compartilhado por todas as instâncias do mesmo caractere do
documento, exceto a posição que será variável. Portanto, em vez de armazenarem
800 bjetos com três atributos, armazenam-se 00 objetos com um tributo e
ponteiro para bjeto yweight.
Pessoal, esse padrão de projeto deve ser utilizado quando houver uma
necessidade de uma referência mais versátil ou sofisticada para um objeto do que
um simples ponteiro. Por exemplo, proxies ais criam objetos caros por
demanda proxies e proteção controlam o cesso o bjeto riginal.
Considerem a hipótese de um sistema que acesse um banco de dados por meio
de uma classe de conexão.
No ntanto, por edidas de gurança, vamos supor que e eseja que sse
sistema não tenha cesso direto o anco e dados referido. Dessa forma, o
usuário se conectará ao Proxy (i.e., a classe substituta ou suplente) e o Proxy que
coleções. O Iterator permite que se percorra todas essas coleções sem precisar
saber detalhes de seu funcionamento.
Pessoal, esse padrão de projeto deve ser utilizado quando um conjunto de objetos
se comunicar de maneira bem definida, porém complexa e quando o reúso de um
objeto for difícil por referenciar e se comunicar com muitos outros objetos.
Ademais, ele é t izado quando mportamento distribuído ntre diversas
classes puder r tomizado s m a iação de itas subclasses.
maneira de esfazer ções sem ter cesso o ue stava ndo escrito, ele apenas
retorna o estado nterior, mas sem olhar o que estava escrito.
Pessoal, esse padrão de projeto deve ser utilizado quando uma mudança em um
objeto requisitar mudanças em outros e não se souber quantos objetos
necessitam ser modificados. Ele também é zado quando a bstração
possuir dois aspectos, um dependente o utro. Ademais, é recomendado
quando um objeto for capaz de notificar outros sem assumir quem são.
E agora? Como ficam os gráficos? Tem que atualizar cada um na mão? Enquanto
ele não atualiza, os gráficos ficarão desatualizados? Não haverá nem uma
notificação de que há novos dados? Bem, o padrão Observer serve para isso! Ele
cria a dependência dos gráficos em relação à tabela de do ue, quando a
tabela da e estado, os gráficos são atualizados automaticamente.
Pessoal, esse padrão de projeto deve ser utilizado quando várias classes
relacionadas diferirem apenas em seus comportamentos e que houver
necessidade de diferentes variantes de um algoritmo. Ele também é ut zado
quando u a asse definir muitos comportamentos e les parecerem como
declarações condicionais em suas operações.
Pessoal, se tiver com o tempo apertado, estudem apenas esses acima! Do esmo
modo, podemos afirmar que, dos 23 P drões de P ojeto, onze rrespondem à
15% as questões de prova: Decorator, Flyweight, Proxy, Chain of Responsability,
Interpreter, Mediator, Memento, State, Strategy e Template Method. Os seis
padrões restantes, estão no meio termo e correspondem a 30% das questões de
prova. Para concursos da Fundação Carlos Chagas, vale dar uma olhada no
Factory Method também, pois eles adoram cobrar.
Galera, para ser em sincero m vocês, eu onsidero Pa rões GRASP mais como
uma o ofia de projeto o que mo m conjunto de padrão e projeto. Eles
descrevem princípios fundamentais de desenho orientado a objetos e definição de
responsabilidades, expressos em padrões. Vocês sabem o que significa o verbo To
Grasp? Significa tomar, agarrar, apreender, captar, aferrar, pegar de súbito.
Expert:
Creator:
High Cohesion:
Low Coupling: