O que é um padrão?
Download
Report
Transcript O que é um padrão?
PROGRAMAÇÃO ORIENTADA A OBJETOS
AULA 02
DECORATOR (DECORADOR)
Permite adicionar e remover responsabilidades de
uma classe em tempo de execução (dinamicamente).
Alternativa flexível a generalização/especialização
para extensão de funcionalidade.
DECORATOR - GERAL
DECORATOR – EXEMPLO 1
DECORATOR – EXEMPLO 2
DECORADOR: EXERCÍCIO
Faça um modelo UML para criar e desenhar as três
telas abaixo: diagramas de classes e seqüência
Olá, Pedro Silva!
TELA
ESSENCIA
Olá, Pedro Silva!
Olá, Pedro Silva!
AAAAAAAAAA
TELA
ESSENCIA
TELA
ESSENCIA
SUBTOTAL X
SUBTOTAL X
TOTAL Z
cc = new Tela();
cc = new CabecalhoVisitante( cc );
cc.desenha();
EXERCÍCIO
Implementar em Java o exemplo do slide anterior.
PADRÃO COMMAND (COMANDO)
Encapsula comandos em objetos tal que é possível
controlar sua seleção e seqüenciamento, enfileirá-los,
desfazê-los (undo ), isto é, manipulá-los de forma
geral.
Permite tornar a execução de operações mais flexível
(ex: desfazer).
PADRÃO COMANDO - EXEMPLO
PADRÃO SINGLETON: EXEMPLO I
PADRÃO SINGLETON: EXEMPLO I
package pp.Singleton;
public class Financeiro extends Thread
{
public void run()
{
GerenciadorBD gbd = GerenciadorBD.GetInstance();
gbd.AbrirConexao();
gbd.InserirRegistro();
gbd.FecharConexao();
}
}
PADRÃO SINGLETON: EXEMPLO I
package pp.Singleton;
public class Secretaria extends Thread {
public void run()
{
GerenciadorBD gbd = GerenciadorBD.GetInstance();
}
}
gbd.AbrirConexao();
gbd.InserirRegistro();
gbd.FecharConexao();
PADRÃO SINGLETON: EXEMPLO I
package pp.Singleton;
public class GerenciadorBD {
static private GerenciadorBD TheInstance;
private GerenciadorBD() {
System.out.println("Construindo GerenciadorBD ...");
}
synchronized static public GerenciadorBD GetInstance() {
if (TheInstance == null) {
TheInstance = new GerenciadorBD();
}
return TheInstance;
}
public void AbrirConexao() {}
public void FecharConexao() {}
public void InserirRegistro() {}
}
PADRÃO SINGLETON: EXEMPLO I
package pp.Singleton;
public class Teste
{
public static void execute()
{
Secretaria s = new Secretaria( );
Financeiro f = new Financeiro( );
s.start( );
f.start( );
}
}
EXERCÍCIOS
EXERCÍCIO: DECORADOR
Aplique o padrão decorator para modelar a
seguinte aplicação:
Os funcionários de certa empresa podem
assumir qualquer uma das suas funções,
inclusive de forma cumulativa. O conjunto de
funções assumidas por certo funcionário é
totalmente dinâmico, podendo sofrer alterações
a cada dia de trabalho. Para cada uma dessas
funções, há uma correspondente remuneração.
Assim, o salário mensal de cada funcionário é
calculado de acordo com as funções assumidas
ao longo do mês.
Decoração: funcionário de certa empresa
EXERCÍCIO: COMMAND
Aplique o padrão command para modelar a
seguinte aplicação:
Consultas em um sistema de informações
médicas: Cada operação de consulta realizada
no sistema de informações deve ser armazenada
como um objeto a fim de se poder emitir uma
conta para cada cliente do sistema. O preço de
cada consulta pode variar dependendo da
informação desejada e do volume de dados
fornecido como resposta.
Consultas em um sistema
de informações
médicas.
EXERCÍCIO: COMMAND
Aplique o padrão command para modelar a seguinte
aplicação:
Pilotagem de uma aeronave: Cada operação
realizada pelo piloto de uma aeronave deve ser
armazenada como um objeto a fim de se poder
analisar o histórico de operações em auditorias
rotineiras e também em caso de acidentes.
Pilotagem de uma aeronave.
STRATEGY
PADRÃO STRATEGY (ESTRATÉGIA)
Encapsula algoritmos relacionados em classes que são
subclasses de uma classe comum.
Permite a seleção de algoritmo variar por objeto e
também no decorrer do tempo.
PADRÃO STRATEGY – GENERAL
PADRÃO STRATEGY – EXEMPLO 2
PADRÃO STRATEGY – EXEMPLO 1
EXERCÍCIO: ESTRATEGIA
Aplique o padrão observador para modelar a seguinte aplicação:
Há diferentes algoritmos para envio de arquivos
multimídia.
Um servidor de arquivos multimídia pode enviar arquivos
requisitados pela rede de diferentes modos, isto é, com
diferentes níveis de qualidade, dependendo das condições
atuais do meio de comunicação e também do dispositivo
utilizado pelo cliente. Por exemplo, quando há bastante
banda de rede disponível, os arquivos podem ser enviados
com qualidade máxima, mas também é preciso que o cliente
tenha um equipamento com suficiente poder de
processamento. Assim, dependendo do tipo do arquivo
(imagem ou som) e das condições da comunicação e do cliente,
o servidor pode empregar algoritmos diferentes para o envio
de cada arquivo. Há à disposição do servidor, uma variedade
de 4 algoritmos para envio de imagens (incluindo um para
envio de imagem em preto&branco) e outros 3 algoritmos
para envio de som.
ABSTRACT
FACTORY
PADRÃO ABSTRACT FACTORY
(FÁBRICA ABSTRATA)
Kit
ou Toolkit
Permite a criação de instâncias de um
conjunto de classes abstratas relacionadas a
partir de respectivo um conjunto de classes
concretas. Pode ser muito útil quando se
precisa trabalhar com uma variedade de
entidades externas complexas.
Permite criar famílias coordenadas de objetos
em tempo de execução, escolhidos a partir de
um conjunto de estilos.
PADRÃO ABSTRACT FACTORY - GERAL
PADRÃO ABSTRACT FACTORY – EXEMPLO II
A classe abstrata WidgetFactory possui duas
especializações:
MotifWidgetFactory para widgets* Motif e
QtWidgetFactory para widgets* Qt.
Tais especializações são classes concretas capazes de
produzir os elementos da interface gráfica.
O cliente do toolkit obtém os elementos gráficos de
que necessita por meio da classe (interface)
WidgetFactory sem ter conhecimento das classes
concretas.
Da mesma maneira, o cliente somente interage com
as interfaces que representam os elementos
produzidos pela Abstract Factory (no exemplo, a
classe Janela e a classe Botão).
* Um widget é um componente de uma interface gráfica do utilizador (GUI),
o que inclui janelas, botões, menus, ícones, barras de rolagem, etc
PADRÃO: ABSTRACT FACTORY
ABSTRACT FACTORY: JAVA
abstract class WidgetFactory
{
public static WidgetFactory obterFactory()
{
if( Configuracao.obterInterfaceGraficaAtual() ==
Configuracao.MotifWidget )
{return new MotifWidgetFactory(); }
else
{ return new QtWidgetFactory(); }
}
public abstract Botao criarBotao();
}
ABSTRACT FACTORY: JAVA
class MotifWidgetFactory extends WidgetFactory
{
public Botao criarBotao() {
return new BotaoMotif();
}
}
class QtWidgetFactory extends WidgetFactory
{
public Botao criarBotao() {
return new BotaoQt();
}
}
ABSTRACT FACTORY: JAVA
abstract class Botao
{
public abstract void desenhar();
}
class BotaoMotif extends Botao {
public void desenhar() {
System.out.println("Eu sou um botao Motif!");
}
}
class BotaoQt extends Botao {
public void desenhar() {
System.out.println("Eu sou um botao Qt!");
}
}
ABSTRACT FACTORY: JAVA
public class Cliente
{
public static void main(String[] args)
{
WidgetFactory factory = WidgetFactory.obterFactory();
Botao botao = factory.criarBotao();
botao.desenhar();
}
}
PADRÃO ABSTRACT FACTORY – EXEMPLO I
EXERCÍCIO
Implementar em Java o exemplo I do slide anterior.
PADRÃO MESTRE-ESCRAVO
•
•
•
Contexto: “Dividir e Conquistar” é um princípio comum para
solucionar vários problemas computacionais. Em vários sistemas é
necessário aplicar este princípio.
Problema: Dividir as tarefas em sub-tarefas idênticas .Uma tarefas é
dividida em sub-tarefas idênticas que podem ser processadas
independentemente. O resultado final será obtido pela junção dos
resultados de cada sub-tarefa.
Solucão: Introduzir um elemento controlado entre o cliente dos
serviços e os vários elementos processadores para delegar as sub-tarefas
e agrupar os resultados no resultado final.
PADRÃO MESTRE-ESCRAVO – DINÂMICA
PADRÃO PROXY - IDÉIA
• O Padrão Proxy permite
que clientes de um
serviço utilizem um
representante do
componente que oferece
o serviço. Aumenta a
eficiência, a segurança e
facilita o acesso.
• O Proxy pode substituir
o servidor quando
ocorrem problemas com
o servidor.
• O Proxy permite criar
uma independência de
endereçamento e
implementação do
servidor.
O PADRÃO PROXY
•
•
•
Contexto: Um cliente precisa acessar um serviço de um outro componente em um
sistema distribuído. O acesso direto é tecnicamente possível, mas pode não ser a
melhor opção.
Problemas: O acesso direto pode não ser eficiente em tempo de execução, ter alto
custo e não ser seguro. O cliente não precisa ficar dependente de endereço de rede do
componente.
Solução: Utilize um representante do cliente que ofereça o serviço de forma idêntica
e realize pré- e pós-processamento adicionais para garantir a Qualidade do Serviço.
O PADRÃO BROKER (CORRETOR) - IDÉIA
•
•
O Padrão Broker é utilizado para estruturar sistemas distribuídos
separando componentes que interagem através de chamadas remota de
serviços.
O broker é responsável por coordenar a comunicação, encaminhado as
solicitações e transmitido os resultados ou exceções.
O PADRÃO BROKER (CORRETOR) –
ESTRUTURA
•
•
•
Contexto: O ambiente é distribuído e heterogêneo com componentes
cooperativos independentes.
Problema: Sistemas acoplados não oferecem flexibilidade, dificultam
mudanças e manutenção.
Solução: Introduzir um componente broker para permitir uma maior
desacoplamento entre clientes e servidores, permitindo independência
de plataforma (ambientes heterogêneos) e de endereçamento.
O PADRÃO BROKER – DINÂMICA
PADRÃO OBSERVER (OBSERVADOR)
•
•
•
Contexto: Situações nas quais vários componentes dependem de dados que são
modificados em outro componente (sujeito).
Problema: Os dados do componente sujeito modificam-se constantemente e
precisam ser atualizados nos outros componentes. O número de componentes pode
variar.
Solução: Utilizar um mecanismo de registro que permite ao componente sujeito
notificar aos interessados sobre mudanças.
PADRÃO OBSERVER – ESTRUTURA
PADRÃO MODEL-VIEW-CONTROLER - MVC
•
•
•
Contexto: Aplicações interativas com interfaces de usuário gráficas flexíveis e
controladas pelo usuários.
Problema: Interfaces gráficas precisam representar uma mesma interface em
diferentes janelas. O usuário deve poder tomar a iniciativa de controle de entrada e
mudanças dos dados. Todas as janelas devem ser atualizadas sempre que houver
mudanças nos dados.
Solução: Utilizar o padrão Observer e estendê-lo para permitir o controle das
janelas baseado-em-eventos. O Padrão MVC estende o Observer incorporando um
elemento controlador (Controller). O MVC foi introduzido originalmente no
Smalltalk-80.
PADRÃO MVC – ESTRUTURA
PADRÃO MVC – DINÂMICA
FIM
Tempo livre para começar e/ou tirar dúvidas do
trabalho.