Padrões de comportamento

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 comportamentais.


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

Além dos problemas com a criação dos objetos e com a combinação de estruturas para produzir funcionalidades elaboradas,


precisamos também lidar com a interação entre os objetos, de forma que a comunicação entre eles seja previsível e não redundante.

A comunicação entre objetos e de um objeto consigo mesmo definem questões de comportamento, que incluem:


  • Como uma coleção pode apresentar seus elementos independentemente de sua representação interna?
  • Como um objeto pode representar e fazer uso de alterações em seu próprio estado?
  • Como um objeto pode monitorar mudanças no estado de outro objeto?

Essas questões são tratadas pelos padrões de projeto comportamentais.


Esses padrões tratam da interação/comunicação entre objetos e sua respectiva descrição pelas classes/interfaces.

A ideia desses padrões é a de definir formas eficientes e escalonáveis de expor comportamentos comuns dos objetos.


Esse objetivo é alcançado através da criação de classes, interfaces e métodos que, em conjunto, definem um certo comportamento.

Esses elementos podem ser facilmente reconhecidos quando encontrados no programa, promovendo o entendimento das capacidades das partes envolvidas em um sistema.


Vejamos alguns exemplos:

Iterator

O padrão Iterator resolve os seguintes problemas:

  • Acesso aos elementos de um objeto agregado ou coleção, sem expor sua representação interna.
  • Definir maneiras alternativas de acesso aos elementos de uma coleção ou agregado sem mudar sua interface.

Para esse fim, é definida uma interface (ou classe abstrata) Iterador que expõe as capacidades de iteração para um tipo de coleção/agregado.

A concretização do iterador implica na implementação de uma forma específica de iterar sobre os elementos da coleção de interesse.

Memento

O padrão Memento confere aos objetos a capacidade de representar alterações em seu próprio estado e oferecer a outros a possibilidade de fazê-lo retornar a um estado anterior, sem quebrar o encapsulamento.

Para isso são criadas três classes com papéis bem distintos:

O Originador (Originator), que implementa uma forma de guardar a memória do seu próprio estado (memento), e uma forma de restaurá-la.

O Memento, que representa a memória do estado de um certo tipo de objeto.

O Cuidador (Caretaker), que cuida de um objeto e pode requisitar deste um memento, para posteriormente solicitar sua eventual restauração.

Observer

O padrão Observer permite que um objeto notifique outros a respeito de alguma mudança no seu estado, representando um evento de interesse.

Isso é feito através de um mecanismo de assinatura, onde os interessados nos eventos de um certo objeto são registrados por esse objeto. O objeto então sabe quem notificar e quando.

A implementação desse padrão é feita usando uma interface (ou classe abstrata) observadora Observer e de uma classe sujeita aos observadores (compatível), chamada Subject.

O objeto Subject mantém referências para todos os seus observadores, que são registradas ou "desregistradas" através de métodos específicos.

Quando há um evento relevante, o objeto Subject notifica seus Observers registrados através de um método update, que realiza as operações relevantes em cada observador.

As classes Subject e Observer são alternativamente chamadas de Publisher e Subscriber, respectivamente.

Situações comuns de interação entre objetos podem ser modeladas através dos comportamentos descritos nos padrões de projeto comportamentais.


Tal como os padrões criacionais e estruturais, devem ser integrados à maneira de pensar do programador, promovendo a identificação antecipada de desafios do projeto e o desenvolvimento mais ágil das soluções.

Outros padrões desse tipo incluem:


Perguntas:

  1. Dê um exemplo de situação onde podemos aplicar o padrão Memento, além do Undo/Redo.
  2. Indique um problema que pode ocorrer com a aplicação do padrão Observer na linguagem Java.

Até a próxima aula!