Baixe o app para aproveitar ainda mais
Prévia do material em texto
PADRÕES DE PROJETO DE SOFTWARE Aula 5 – Padrões estruturais GoF PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE O que veremos nesta terceira aula Iniciar o estudo da família de padrões comportamentais GoF; Conhecer os padrões comportamentais Chain of Responsability, Interpreter e Template Method; Aprender as principais aplicações e funcionalidades destes padrões; PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Classificação dos padrões GoF segundo Metsker [2] PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Interpreter "Dada uma linguagem, definir uma representação para sua gramática junto com um interpretador que usa a representação para interpretar sentenças na linguagem.“ [GoF] PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Interpreter Descreve como projetar um conjunto de classes para representar e interpretar uma gramática para linguagens simples Sua aplicação é recomenda naquelas situações em que há necessidade de interpretar uma linguagem qualquer e ao mesmo tempo quando se quer representar sentenças da linguagem como árvores abstratas sintáticas PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo padrão Interpreter PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo padrão Interpreter PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo padrão Interpreter PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo padrão Interpreter PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo padrão Interpreter PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo padrão Interpreter PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo padrão Interpreter PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Template Method "Definir o esqueleto de um algoritmo dentro de uma operação, deixando alguns passos a serem preenchidos pelas subclasses. Template Method permite que suas subclasses redefinam certos passos de um algoritmo sem mudar sua estrutura." [GoF] PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Template Method Fornece uma estrutura fixa, de um algoritmo, esta parte fixa deve estar presente na superclasse, sendo obrigatório uma classeAbstrata que possa conter um método concreto, pois em uma interface só é possível conter métodos abstratos que definem um comportamento, esta é a vantagem de ser uma Classe Abstrata porque também irá fornecer métodos abstratos às suas subclasses, que por sua vez herdam este método, por Herança (programação), e devem implementar os métodos abstratos fornecendo um comportamento concreto aos métodos que foram definidos como abstratos. Com isso certas partes, do algoritmo, serão preenchidos por implementações que irão variar, ou seja, implementar um algoritmo em um método, postergando a definição de alguns passos do algoritmo, para que outras classes possam redefiní-los PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Problema O que é um Template Method Um Template Method define um algoritmo em termos de operações abstratas que subclasses sobrepõem para oferecer comportamento concreto Quando usar? Quando a estrutura fixa de um algoritmo puder ser definida pela superclasse deixando certas partes para serem preenchidos por implementações que podem variar PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Estrutura PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo public abstract class AbstractClass { public final void templateMethod() { System.out.println("AbstractClass.templateMethod() called"); primitiveOperation1(); primitiveOperation2(); } public abstract void primitiveOperation1(); public abstract void primitiveOperation2(); } PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo public class Concrete1 extends AbstractClass { public void primitiveOperation1() { System.out.println("Concrete1.primitiveOperation1() called"); } public void primitiveOperation2() { System.out.println("Concrete1.primitiveOperation2() called"); } } PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo public class Concrete2 extends AbstractClass { public void primitiveOperation1() { System.out.println("Concrete2.primitiveOperation1() called"); } public void primitiveOperation2() { System.out.println("Concrete2.primitiveOperation2() called"); } } PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo public class TestTemplateMethod { public static void main(String[] args) { System.out.println("Test TemplateMethod"); System.out.println("-------------------------"); AbstractClass class1 = new Concrete1(); AbstractClass class2 = new Concrete2(); class1.templateMethod(); class2.templateMethod(); } } PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Chain of Responsability "Evita acoplar o remetente de uma requisição ao seu destinatário ao dar a mais de um objeto a chance de servir a requisição. Compõe os objetos em cascata e passa a requisição pela corrente até que um objeto a sirva." [GoF] PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Chain of Responsability representa um encadeamento de objetos receptores para o processamento de uma série de solicitações diferentes. Esses objetos receptores passam a solicitação ao longo da cadeia até que um ou vários objetos a tratem. Cada objeto receptor possui uma lógica descrevendo os tipos de solicitação que é capaz de processar e como passar adiante aquelas que requeiram processamento por outros receptores. fornece um acoplamento mais fraco por evitar a associação explícita do remetente de uma solicitação ao seu receptor e dar a mais de um objeto a oportunidade de tratar a solicitação. exemplo da aplicação é o mecanismo de herança nas linguagens orientadas a objeto: um método chamado em um objeto é buscado na classe que implementa o objeto e, se não encontrado, na superclasse dessa classe, de maneira recursiva. PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Quando utilizar mais de um objeto pode tratar uma solicitação e o objeto que a tratará não é conhecido a priori; o objeto que trata a solicitação deve ser escolhido automaticamente; deve-se emitir uma solicitação para um dentre vários objetos, sem especificar explicitamente o receptor; o conjunto de objetos que pode tratar uma solicitação deveria ser especificado dinamicamente. PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Problema Permitir que vários objetos possam servir a uma requisição ou repassá-la Permitir divisão de responsabilidades de forma transparente PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo 2 public abstract class Logger { public static int ERR = 3; public static int NOTICE = 5; public static int DEBUG = 7; protected int mask; // The next element in the chain of responsibility protected Logger next; public Logger setNext(Logger log) { next = log; return log; } public void message(String msg, int priority) { if (priority <= mask) { writeMessage(msg); } if (next != null) { next.message(msg, priority); } } protected abstract void writeMessage(String msg); } PADRÕES ESTRUTURAIS GOF – AULA5 PADRÕES DE PROJETO DE SOFTWARE Exemplo 2 class StdoutLogger extends Logger { public StdoutLogger(int mask) { this.mask = mask; } protected void writeMessage(String msg) { System.out.println("Writing to stdout: " + msg); } } class EmailLogger extends Logger { public EmailLogger(int mask) { this.mask = mask; } protected void writeMessage(String msg) { System.out.println("Sending via email: " + msg); } } class StderrLogger extends Logger { public StderrLogger(int mask) { this.mask = mask; } protected void writeMessage(String msg) { System.err.println("Sending to stderr: " + msg); } } PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Exemplo 2 public class ChainOfResponsibilityExample { public static void main(String[] args) { // Build the chain of responsibility Logger logger, logger1; logger1 = logger = new StdoutLogger(Logger.DEBUG); logger1 = logger1.setNext(new EmailLogger(Logger.NOTICE)); logger1 = logger1.setNext(new StderrLogger(Logger.ERR)); // Handled by StdoutLogger logger.message("Entering function y.", Logger.DEBUG); // Handled by StdoutLogger and EmailLogger logger.message("Step1 completed.", Logger.NOTICE); // Handled by all three loggers logger.message("An error has occurred.", Logger.ERR); } } PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Estratégias de chain of responsibility Pode-se implementar um padrão de várias formas diferentes. Cada forma é chamada de estratégia Chain of Responsibility pode ser implementada com estratégias que permitem maior ou menor acoplamento entre os participantes Usando um mediador: só o mediador sabe quem é o próximo participante da cadeia Usando delegação: cada participante conhece o seu sucessor PADRÕES ESTRUTURAIS GOF – AULA 5 PADRÕES DE PROJETO DE SOFTWARE Bibliografia Utilizando UML e Padrões: uma introdução à análise e ao projeto orientados a objetos - 3ª Edição Autor: Larman, Craig Padrões de Projeto: soluções reutilizáveis de software orientado a objetos Autor: Gamma, Erich ... [et al] * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Compartilhar