Padrões estruturais

Computação II - Ciência da Computação


Prof.: Danilo S. Carvalho

Nessa aula, vamos aprender um pouco mais sobre os padrões de projeto estruturais.


Ao final da aula, entenderemos melhor o que são os padrões estruturais e quando utilizá-los.

Muitos dos problemas com que temos que lidar no projeto de software referem-se a maneira como combinamos as estruturas do programa (ex: classes, interfaces) para alcançar as funcionalidades desejadas.


Algumas perguntas comuns nesse sentido são:


  • Como combinar as capacidades um grupo de classes mantendo a independência entre elas?
  • Como parte da estrutura comum de um grupo de objetos pode ser compartilhada para reduzir sua redundância?

Para responder a perguntas como essas, recorremos aos padrões de projeto estruturais.


Esses padrões tratam de como as classes e objetos podem ser combinados para formar estruturas mais complexas.

Nesse caso, a ideia é facilitar o projeto ao identificar uma maneira eficiente e escalonável de combinar as estruturas, dependendo do tipo de combinação e do efeito desejado.


Para esse fim, podem ser usadas classes com papéis específicos e algoritmos que produzem uma funcionalidade desejada, mais que a simples agregação de estruturas existentes.

Vejamos alguns exemplos:

Adapter

O padrão Adapter responde às seguintes perguntas:

  • Como posso reusar uma classe que não possui uma interface requerida por um certo código (cliente)?
  • Como classes que implementam interfaces incompatíveis podem funcionar em conjunto?
  • Como podemos fornecer uma interface alternativa para uma classe qualquer?

A classe que oferece a interface desejada para uma funcionalidade provida por uma classe incompatível recebe o nome de adaptadora (adapter).

Decorator

O padrão Decorator permite adicionar capacidades ou comportamento a uma classe sem interferir em sua estrutura.

A ideia aqui é "cobrir" um objeto de uma classe com um "decorador" compatível, onde o decorador expõe as capacidades adicionais, implementadas sobre aquelas da classe decorada.

Isso é feito implementando uma interface comum, tal que uma classe decoradora possa acrescentar suas capacidades a qualquer classe compatível.

Flyweight

O padrão Flyweight consiste em identificar partes comuns na representação de objetos em uma estrutura de classes e combiná-las em uma estrutura que possa ser reutilizada por todas as classes interessadas.

Essa estrutura comum é instanciada apenas uma vez para cada um dos seus possíveis estados, economizando os recursos computacionais (especialmente memória) usados para manter esses objetos.

Dessa forma, várias instâncias de uma classe ou grupo de classes podem compartilhar os mesmos dados, reduzindo a redundância e aumentando a eficiência.

A medida que as tarefas a serem realizadas pelas classes se tornam mais complexas, a organização de heranças, interfaces e composição de classes se torna mais desafiadora.

Assim, o uso de padrões estruturais deve se tornar parte do repertório básico do programador.

Outros padrões desse tipo incluem:

Perguntas:

  1. Dê um exemplo de situação onde podemos aplicar o padrão Adapter.
  2. Qual a diferença entre o padrão Flyweight e o padrão Object pool?

Até a próxima aula!