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.