Buscar

Padrões Estruturais GoF - Aula 5

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]
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

Outros materiais

Materiais relacionados

Perguntas relacionadas

Perguntas Recentes