Design Patterns
Projeto de Sistemas de Software
Leandra Mara da Silva
Motivação
• Aprimorar conhecimentos sobre Projeto de Sistemas de
Software, realizando um estudo incremental dos Padrões de
Projeto apresentados em [GoF].
• Palavras-chave: Engenharia de Software, Projeto de Sistemas de
Software, Padrões de Projeto.
© LES/PUC-Rio
Padrão State
State
• Classificação
– Comportamental de Objeto
• Também conhecido como:
– Objects for States
• Propósito
– Permitir a um objeto alterar o seu comportamento quando o
seu estado interno mudar. O objeto parecerá ter mudado de
classe.
© LES/PUC-Rio
State
• Motivação
Exemplo de Problema:
– Um objeto responde de maneira distinta dependendo do seu
estado
© LES/PUC-Rio
State
Exemplo de Solução:
– Conexão possui um objeto que representa o seu estado e que
executa as tarefas dependentes de estado (polimorfismo).
© LES/PUC-Rio
State
• Aplicabilidade
– O comportamento de um objeto depende do seu estado que é
alterado em tempo de execução
– Operações de um objeto possuem condicionais grandes, de
várias alternativas (sintoma do caso anterior).
Frequentemente, muitas operações irão conter essa mesma
estrutura condicional.
• Estados são usualmente representados por uma ou mais
constantes
• O State coloca cada ramo de comando condicional em uma classe
separada, tratando os estados dos objetos como objetos
propriamente ditos
© LES/PUC-Rio
State
• Estrutura
• Questão: quem define as transições de estado?
© LES/PUC-Rio
State
• Participantes
– Context
• define a interface de interesse para os clientes
• mantém uma instância de uma subclasse ConcreteState que define
o estado corrente
– State
• define uma interface para encapsulamento associado com um
determinado estado do Context
– ConcreteState subclasses
• cada subclasse implementa um comportamento associado com um
estado do Context
© LES/PUC-Rio
State
• Colaborações
– Context delega solicitações específicas de estados para o
objeto corrente ConcreteState
– Um contexto pode passar a si mesmo como um argumento
para o objeto State que trata a solicitação. Isso permite ao
objeto State acessar o contexto, se necessário
– Context é a interface primária para os clientes. Os clientes não
tem que lidar com objetos State diretamente
– Tanto Context quanto as subclasses de ConcreteState podem
decidir qual estado sucede outro
© LES/PUC-Rio
State
• Exemplo de Código
– Situação: usuário de biblioteca quer
pegar empréstimo de livros.
Dependendo do seu estado, o usuário
pode ou não pegar livros
– Classes Envolvidas: UsuarioContexto,
UsuarioState,
UsuarioSemEmprestimo,
UsuarioComEmprestimo,
UsuarioEmDebido
© LES/PUC-Rio
State – Exemplo de Código
© LES/PUC-Rio
State – Exemplo de Código
© LES/PUC-Rio
State – Exemplo de Código
© LES/PUC-Rio
State
– Outros casos exemplos:
• Estados de seleção no Paint (lápis selecionado, balde
selecionado)
• Estados de um projeto em um sistema de gerenciamento de
projetos
© LES/PUC-Rio
State
• Conseqüências
– Separa comportamento dependente de estado.
• pró : Novos estados/comportamentos podem ser facilmente
adicionados e ganho em legibilidade. A intenção sobre as transições
de estado fica mais clara
• Contra: aumento no número de classes; menos compacto
– Transição de estados é explícita
– Objetos States podem ser compartilhados
• Quando não possuem variáves de instância podem ser
compartilhados essencialmente como flyweights, sem estado
intrínseco, somente comportamento
© LES/PUC-Rio
Fim!!
Download

State