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:
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:
O padrão Iterator resolve os seguintes problemas:
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.
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.
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:
Até a próxima aula!