Em geral, a descrição de um padrão tem quatro elementos essenciais:
1. O nome do padrão é uma referência que podemos usar para descrever um problema de projeto, suas soluções e conseqüências em uma ou duas palavras. Dar nome a um padrão aumenta imediatamente o nosso vocabulário de projeto. Isso nos permite projetar em um nível mais alto de abstração. Ter um vocabulário para padrões permite-nos conversar sobre eles com nossos colegas, em nossa documentação e até com nós mesmos.
2. O problema descreve em que situação aplicar o padrão. Ele explica o problema e seu contexto. Pode descrever problemas de projeto específicos. Pode descrever estruturas de classe e, algumas vezes, o problema incluirá uma lista de condições que devem ser satisfeitas para que faça sentido aplicar o padrão.
3. A solução descreve os elementos que compõem o padrão de projeto, seus relacionamentos, suas responsabilidades e colaborações. A solução não descreve um projeto concreto ou uma implementação em particular porque um padrão é como um gabarito que pode ser aplicado em muitas situações diferentes. Em vez disso, o padrão fornece uma descrição abstrata de um problema de projeto e de como um arranjo geral de elementos (classes e objetos, no nosso caso) o resolve.
4. As consequências são os resultados e análises das vantagens e desvantagens (trade-offs) da aplicação do padrão. Embora as consequências sejam raramente mencionadas quando descrevemos decisões de projeto, elas são críticas para a avaliação de alternativas de projetos e para a compreensão dos custos e benefícios da aplicação do padrão.
A Gang of Four utiliza a seguinte notação para a descrição de um Padrão de Projeto:
Nome e classificação do padrão
Intenção e objetivo (problema)
Também conhecido como (problema)
Motivação (contexto)
Aplicabilidade (contexto)
Estrutura (solução)
Participantes (solução)
Colaborações (solução)
Consequências
Implementação (solução)
Exemplo de código (contexto)
Usos conhecidos (contexto)
Padrões relacionados (contexto)
Os 23 padrões de projeto GoF podem ser classificados por dois critérios: finalidade e escopo.
A finalidade, reflete o que um padrão faz. Os padrões podem ter finalidade de criação, estrutural ou comportamental.
Os padrões de criação se preocupam com o processo de criação de objetos.
Os padrões estruturais lidam com a composição de classes ou de objetos.
Os padrões comportamentais caracterizam as maneiras pelas quais classes ou objetos interagem e distribuem responsabilidades.
O escopo especifica se o padrão se aplica primariamente a classes ou a objetos.
Os padrões para classes lidam com os relacionamentos entre classes e suas subclasses. Esses relacionamentos são estabelecidos através do mecanismo de herança, assim eles são estáticos – fixados em tempo de compilação.
Os padrões para objetos lidam com relacionamentos entre objetos que podem ser mudados em tempo de execução e são mais dinâmicos. Quase todos utilizam a herança em certa medida. Note que a maioria está no escopo de objeto.
Escopo de Classe:
Adapter
Escopo de Objeto:
Adapter (object)
Bridge
Composite
Façade
Flyweight
Proxy
Escopo de Classe:
Interpreter
Escopo de Objeto:
Chain of Responsibility
Command
Iterator
Mediator
Memento
Observer
State
Visitor
Para a disciplina, vamos estudar os padrões de projeto GoF por meio de cenários.
Apesar de grande parte dos cenários serem sobre sistemas fictícios e criados para ilustrar a aplicação dos padrões, as situações apresentadas por eles são realistas e aplicáveis em softwares reais.
A abordagem de cenários foi a adotada por GoF e também será a nossa.