560 likes | 663 Views
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.
E N D
ProgramaçãoOrientada 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.
Decorador: ExercícioFaça um modelo UML para criar e desenhar as três telas abaixo: diagramas de classes e seqüência Olá, Pedro Silva! Olá, Pedro Silva! Olá, Pedro Silva! AAAAAAAAAA TELA ESSENCIA TELA ESSENCIA TELA ESSENCIA SUBTOTAL X SUBTOTAL X TOTAL Z
cc = new Tela(); cc = newCabecalhoVisitante( cc ); cc.desenha();
Exercício • Implementarem 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 SINGLETON: Exemplo I package pp.Singleton; publicclass Financeiro extends Thread { publicvoidrun() { GerenciadorBDgbd = GerenciadorBD.GetInstance(); gbd.AbrirConexao(); gbd.InserirRegistro(); gbd.FecharConexao(); } }
Padrão SINGLETON: Exemplo I package pp.Singleton; publicclass Secretaria extends Thread { publicvoidrun() { GerenciadorBDgbd = GerenciadorBD.GetInstance(); gbd.AbrirConexao(); gbd.InserirRegistro(); gbd.FecharConexao(); } }
Padrão SINGLETON: Exemplo I package pp.Singleton; publicclassGerenciadorBD { staticprivateGerenciadorBDTheInstance; privateGerenciadorBD() { System.out.println("Construindo GerenciadorBD ..."); } synchronizedstaticpublicGerenciadorBDGetInstance() { if (TheInstance == null) { TheInstance = newGerenciadorBD(); } returnTheInstance; } publicvoidAbrirConexao() {} publicvoidFecharConexao() {} publicvoidInserirRegistro() {} }
Padrão SINGLETON: Exemplo I package pp.Singleton; publicclass Teste { publicstaticvoid execute() { Secretaria s = new Secretaria( ); Financeiro f = new Financeiro( ); s.start( ); f.start( ); } }
Exercício: DECORADOR Aplique o padrão decoratorpara 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.
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.
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.
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.
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.
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 – 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
Abstract Factory: Java abstractclassWidgetFactory{ publicstaticWidgetFactoryobterFactory() { if( Configuracao.obterInterfaceGraficaAtual() == Configuracao.MotifWidget) {returnnewMotifWidgetFactory(); } else { returnnewQtWidgetFactory(); } } publicabstractBotaocriarBotao(); }
Abstract Factory: Java classMotifWidgetFactoryextendsWidgetFactory { publicBotaocriarBotao() { returnnewBotaoMotif(); } } classQtWidgetFactoryextendsWidgetFactory { publicBotaocriarBotao() { returnnewBotaoQt(); } }
Abstract Factory: Java abstractclassBotao { publicabstractvoid desenhar(); } classBotaoMotifextendsBotao{ publicvoid desenhar() { System.out.println("Eu sou um botaoMotif!"); } } classBotaoQtextendsBotao { publicvoid desenhar() { System.out.println("Eu sou um botaoQt!"); } }
Abstract Factory: Java publicclass Cliente { publicstaticvoidmain(String[] args) { WidgetFactoryfactory = WidgetFactory.obterFactory(); Botaobotao = factory.criarBotao(); botao.desenhar(); } }
Exercício • Implementarem 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 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.