Baixe o app para aproveitar ainda mais
Prévia do material em texto
Conceitos básicos de OO • Um objeto empacota tanto dados quanto procedimentos • Os procedimentos são chamados de operações cuja a implementação corresponde ao método. • Um objeto executa um método quando ele recebe uma mensagem de um cliente • As operações são a única maneira de mudar o estado de um objeto. • Assinatura da operação corresponde ao nome da operação, aos objetos que ela aceita como parâmentro e o valor retornado. • Um Tipo é o nome usado para uma interface específica. • Uma interface modela um comportamento esperado. Se comporta como uma classe que contenha apenas métodos abstratos. Conceitos básicos de OO • Quando dizemos que um objeto é do tipo Janela, significa que ele aceita todas as as solicitações para as operações definidas na interface janela. • Um objeto pode ter muitos tipos, asssim como diferentes objetos podem compartilhar do mesmo tipo. • Parte de um objeto pode ser caracterizada por um tipo, e outras partes por outros tipos. • Dizemos que um tipo é um subtipo de outro se sua interface contem a interface do supertipo. • A interface de um objeto não indica nada sobre a sua implementação. Pode-se ter dois objetos que tenham implementações diferentes podem ter interfaces idênticas. Conceitos básicos de OO public interface Pesado { double obterPeso(); } public interface Colorido { Color obterCor(); } public class Porco extends Animal implements Pesado, Colorido { public void fazerBarulho() { System.out.println("Óinc!"); } // Implementação da interface Pesado public double obterPeso() { return 50.00; } // Implementação da interface Colorido public Color obterCor() { return Color.BLACK; } // Uma propriedade só do porco public boolean enlameado() { return true; } } Conceitos básicos de OO • Polimofirmos corresponde a capacidade de dois objetos diferentes responderem de forma diferente a uma mesma mensagem. • Uma implementação de um objeto é definida por sua classe. • Os objetos são criados por instanciação de uma classe. • Uma flecha tracejada indica que uma classe instancia objetos de outra classe • Uma classe abstrada é uma classe que tem como principal objetivo definir uma interface comum para as suas subclasses. Neste caso ela não pode ser instanciada e as operações que não implementa são chamada de operações abstratas. Conceitos básicos de OO • Diferenças entre classe de um objeto e seu tipo. – A classe de um objeto define como ele é implementado. A classe define o estado interno do objeto e a implementação de suas operações. Já o tipo se refere somente a sua interface, isto é, ao conjunto de solicitações que ele pode responder. – Um objeto pode ter muitos tipos, e objetos de diferentes classes podem ter o mesmo tipo. – Quando dizemos que um objeto é uma instância de uma classe, isto significa que dizer que o objeto suporte a interface definida pela classe. – Herança pura de interface significa herdar publicamente de classes abstratas puras. Conceitos básicos de OO Programar para uma interface e não para uma implementação: Todas as subclasses podem responder a solicitações na interface da classe abstrata, tornado-se todas, subtipo desta. Vantangens: • Os clientes permanecem sem conhecimento dos tipos específicos dos objetos que eles usam; • Os clientes permanecem sem conhecimento das classes que implementam estes objetos. • Os clientes somente tem conhecimento das classes abstratas que definem a interface. Desta forma não se deve declarar variáveis como instâncias de classes concretas específicas e sim prende-las somente a uma interface definida por uma classe abstrata. Conceitos básicos de OO Herança versus Composição • A reutilização por meio de subclasse é chamada de reutilização de caixa branca, já que as subclasses tem visibilidade para os métodos da superclasse. Sua definição é definida estaticamente, é mais simples de se utilizar e mais facil de modificar a implementação que esta sendo reutilizada. • A reutilização por meio de composição é chamada de reutilzação de caixa preta, por que os detalhes internos dos objetos não ficam visíveis. Implementações podem ser modificadas em tempo de execução, já que pode-se trocar o objeto deste tenham o mesmo tipo, além de não ficar tão amarrada a implementação da sua superclasse. • Uma linha cheia indica que um objeto de uma classe mantém uma referência para a instância de outra classe. Conceitos básicos de OO • Principais aplicações de padrões de projeto • Toolkits – conjunto de classes relacionadas e reutilizáveis, projetadas para oferecer funcionalidades úteis e de finalidade geral. Ex. Classes coleções para manipular listas, conjuntos e pilhas. Os toolkits não impõe um projeto específico, simplesmente fornecem funcionalidades para auxilar aplicações. • Frameworks – é um conjunto de classes que cooperam para a construção de um software de uma determinada categoria. Ex. Contrução de compiladores, site de venda etc. • Neste caso a customização se dá através da criação de classes específicas para a aplicação, derivadas de classes abstratas do framework. Nesta caso, o framework dita a arquitetura da aplicação. • Um framework enfatiza a reutilização do projeto em relação a reutilização do código. Quando se utiliza um framework você reutiliza o corpo principal e escreve o código que este chama. Desta forma pode-se escrever aplicações mais rapidamente e com estrutruras similares. Por outro lado fica-se preso as decisões de projeto já tomadas pelo framework. Conceitos básicos de OO • Principais aplicações de padrões de projeto • Toolkits – conjunto de classes relacionadas e reutilizáveis, projetadas para oferecer funcionalidades úteis e de finalidade geral. Ex. Classes coleções para manipular listas, conjuntos e pilhas. Os toolkits não impõe um projeto específico, simplesmente fornecem funcionalidades para auxilar aplicações. • Frameworks – é um conjunto de classes que cooperam para a construção de um software de uma determinada categoria. Ex. Contrução de compiladores, site de venda etc. • Neste caso a customização se dá através da criação de classes específicas para a aplicação, derivadas de classes abstratas do framework. Nesta caso, o framework dita a arquitetura da aplicação. • Um framework enfatiza a reutilização do projeto em relação a reutilização do código. Quando se utiliza um framework você reutiliza o corpo principal e escreve o código que este chama. Desta forma pode-se escrever aplicações mais rapidamente e com estrutruras similares. Por outro lado fica-se preso as decisões de projeto já tomadas pelo framework. 10 Design Patterns • Ao longo dos anos, os melhores programadores catalogaram soluções de projeto que eram comuns a problemas específicos no projeto de software orientado a objetos • Essas soluções ficaram conhecidas como Padrões de Projeto (Design Patterns). • O conceito de Padrões de Projeto foi proposto por Christopher Alexander (arquiteto) no final dos anos 70 para o projeto de edificações e cidades. • “Cada padrão descreve um problema que ocorre freqüentemente e então descreve o cerne da solução para aquele problema, de maneira que você pode utilizar essa solução milhares de vezes em situações diferentes” 11 Design Patterns • O conceito de Design Pattens ganhou grande importância após a publicação do livro Design Patterns: Elements of Reusable Object-Oriented Software em 1995 • Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides são conhecidos como “Gang of Four”. • Definições para Object Oriented Design Patterns – São micro-arquiteturas que definem colaborações entreclasses e objetos – Definem soluções simples e elegantes para problemas específicos no projeto de software orientado a objetos – Reutilização de idéias, não de código – São frutos da experiência dos melhores projetistas OO 12 Design Patterns • Design Patterns não são concebidos a partir das primeiras soluções para um determinado problema. • São produtos de várias revisões de projeto e código que tinham como principal objetivo reutilização e flexibilidade. • Por que utilizar Design Patterns ? – Eles foram testados – Eles são reutilizáveis – Eles provêem um vocabulário comum de soluções que pode ser utilizado para expressar grandes soluções de forma sucinta 13 Design Patterns • Os Design Patterns possuem quatro elementos essenciais que os descrevem: – Um Nome – O Problema – A Solução – As Conseqüências 14 Design Patterns • Um Nome – Representa uma maneira simples de descrever um problema de projeto, sua solução e conseqüências em uma ou duas palavras – Facilita a comunicação e documentação – Atualmente, os nomes dos Design Patterns são equivalentes aos nomes de estruturas de dados conhecidas: fila, pilha, lista. • O Problema – Descreve quando aplicar o padrão – Explica o problema e o seu contexto – Algumas vezes, o problema descreve pré-condições que devem existir para aplicação do padrão 15 Design Patterns • A Solução – Descreve os elementos constituintes do projeto, seus relacionamentos, responsabilidades, e colaborações – A solução não descreve um projeto concreto ou implementação particular porque um padrão é apenas um modelo que pode ser utilizado em diversas situações • As Consequências – Descrevem os resultados e trade-offs da aplicação dos padrões Padrões GoF - Criação propósito: • Abstraem o processo de instanciação. Ajudam a tornar um sistema independente de como os seus objetos são criados, compostos e representados. • Utiliza herença para variar a classe que é instanciada enquanto que um padrão de criação de objetos delegará a instanciação para outro objeto. • Encapsulam conhecimento das classes concretas que são usadas pelo sistema. • ocutam o modo de como as instancias destas classes são criadas. Padrões GoF de Criação - FACTORY METHOD Propósito • O padrão Factory Method é caracterizado por retornar uma instância dentre muitas possíveis classes, dependendo dos dados providos a ele. • Definir uma Interface para criar objetos de forma a deixar subclasses decidirem qual classe instanciar Padrões GoF de Criação - FACTORY METHOD Aplicabilidade • Quando uma classe não pode antecipar a classe dos objetos que precisa criar • Quando uma classe quer que as suas subclasses especifiquem os objetos criados • Quando classes delegam responsabilidade para uma de várias classes de apoio e queremos localizar num ponto único o conhecimento de qual subclasse está sendo utilizada Exemplo: • Carro é a classe base (pai) e as classes Vectra, Omega, Gol e Golf derivam dela (filhas). • A classe CarroFactory é a classe Factory que decide qual das subclasses retornar • O método getCarro() é o método de Factory que recebe um parâmetro (tipo) e retorna uma instância da classe Carro Padrões GoF de Criação - FACTORY METHOD • public class Golf extends Carro { • public Golf() { • valor = 35000.0f; • } • } • • public class Gol extends Carro { • public Gol() { • valor = 20000.0f; • } • } • • public abstract class Carro { • protected float valor; • • public float getPreco() { • return valor; • } • } • • public class Vectra extends Carro { • public Vectra() { • valor = 30000.0f; • } • } • • public class Omega extends Carro { • public Omega() { • valor = 50000.0f; • } • } Padrões GoF de Criação - FACTORY METHOD • public class CarroFactory { • public static Carro getCarro( String tipoCarro ) { • if( tipoCarro == null ) return null; • else if( tipoCarro.equals("Vectra") ) return new Vectra(); • else if( tipoCarro.equals("Omega") ) return new Omega(); • else if( tipoCarro.equals("Golf") ) return new Golf(); • else if( tipoCarro.equals("Gol") ) return new Gol(); • else return null; • } • } • public class FactoryExample { • public static void main( String args[] ) { • //parâmetro passado como argumento no console • //pega a instância do tipo do carro • Carro carro = CarroFactory.getCarro( args[0] ); • //mostra o valor • if( carro != null ) { • System.out.println( "Preço: " + carro.getPreco() ); • } • } Padrões GoF de Criação - ABSTRACT FACTORY METHOD • Está a um nível de abstração maior do que o padrão Factory Method. • Antes de instanciar o objeto, é necessário instanciar a sua fábrica de objetos que retorna uma das várias fábricas. Exemplo: sistema precisa de suporte a múltiplos tipos de interfaces gráficas, como Windows, Motif ou MacIntosh. Ao sinalizar ao factory o tipo de interface a ser utilizada, ele retorna a fábrica GUI que retorna os objetos relativos ao tipo. Quando for requisitado um objeto específico como um botão, check-boxes e janelas, a fábrica de GUI retorna as instâncias desses componentes para o Windows. Padrões GoF de Criação - ABSTRACT FACTORY METHOD Padrões GoF de Criação - ABSTRACT FACTORY METHOD public abstract class Fabricante { protected String name; public abstract Carro getCarro( String marca ); public static Fabricante getInstance( String fabricante ) { if( fabricante == null ) { return null; } else if(fabricante.equals("Chevrolet")) { return new Chevrolet(); } else if(fabricante.equals("Volkswagen")) { return new Volkswagen(); } else { return null; } } } public class Chevrolet extends Fabricante { public Chevrolet() { name = "Chevrolet"; } public Carro getCarro( String marca ) { if( marca == null ) { return null; } else if( marca.equals("Vectra") ) { return new Vectra(); } else if( marca.equals("Omega") ) { return new Omega(); } else { return null; } } } Padrões GoF de Criação - ABSTRACT FACTORY METHOD public class Volkswagen extends Fabricante { public Volkswagen() { name = "Volkswagen"; } public Carro getCarro( String marca ) { if( marca == null ) { return null; } else if( marca.equals("Gol") ) { return new Gol(); } else if( marca.equals("Golf") ) { return new Golf(); } else { return null; } } } public class AbstractFactoryExample { public static void main( String args[] ) { //parâmetro passado como argumento no console //pega a instância do fabricante Fabricante fab = Fabricante.getInstance( args[0] ); //pega a instância do carro, de acordo com o fabricante Carro carro = fab.getCarro( args[1] ); //mostra o valor if( carro != null ) { System.out.println( "Preço: " + Carro.getPreco() ); } } } Padrões GoF de Criação - ABSTRACT FACTORY METHOD Observações: Normalmente uma única instância da classe Concrete Factory é instanciada. vantagens: • Isola as classes concretas. Clientes manipulam as instâncias através da interfaces abstratas. • Nomes das classes-produto ficam isolados na implementação da fábrica concreta. Ela pode utilizar diferentes configurações de produto simplesmente trocando a fábrica concreta. • Permite que se utilize todos os objetos de uma família de cada vez. • Uma fábrica concreta especificará seus produtos redefinindo metodo fábrica para cada um. • Abstract Factory somente declara somente uma interface para criação de produtos. Fica a cargodas ConcreteProducts criá-los efetivamente Padrões GoF de Criação - Builder Propósito Separar a construção de um objeto complexo de sua representação para criar representações diferentes com o mesmo processo. director — constrói um objeto utilizando a interface do builder; builder — especifica uma interface para um construtor de partes do objeto-produto; concrete builder — define uma implementação da interface builder, mantém a representação que cria e fornece interface para recuperação do produto; product — o objeto complexo acabado de construir. Inclui classes que definem as partes constituintes. Padrões GoF de Criação - Builder Exemplo: O padrão Builder pode ser utilizado em uma aplicação que converte o formato RTF para uma série de outros formatos e que permite a inclusão de suporte para conversão para outros formatos, sem a alteração do código fonte do leitor de RTF. Padrões GoF de Criação - Builder abstract class ConversorTexto { public void converterCaractere(char c) { // vazio } public void converterParagrafo() { // vazio } public void converterFonte(Fonte f) { // vazio } } class ConversorPDF extends ConversorTexto { public void converterCaractere(char c) { System.out.print("Caractere PDF"); } public void converterParagrafo() { System.out.print("Parágrafo PDF"); } public void converterFonte(Fonte f) { System.out.print("Fonte PDF"); } } class ConversorTeX extends ConversorTexto { public void converterCaractere(char c) { System.out.print("Caractere Tex"); } public void converterParagrafo() { System.out.print("Paragrafo Tex"); } public void converterFonte(Fonte f) { System.out.print("Fonte Tex"); } } class ConversorASCII extends ConversorTexto { public void converterCaractere(char c) { System.out.print("Caractere ASCII"); } } Padrões GoF de Criação - Builder class LeitorRTF { private ConversorTexto conversor; LeitorRTF(ConversorTexto c) { this.conversor = c; } public void lerRTF() { List<Token> tokens = obterTokensDoTexto(); for (Token t : tokens) { if (t.getTipo() == Token.Tipo.CARACTERE) { conversor.converterCaractere(t.getCaractere());} if (t.getTipo() == Token.Tipo.PARAGRAFO) { conversor.converterParagrafo(); } if (t.getTipo() == Token.Tipo.FONTE) { conversor.converterFonte(t.getFonte()); } } } } public class Cliente { public static void main(String[] args) { ConversorTexto conversor; if (args[0].equals("pdf")) { conversor = new ConversorPDF(); } else if (args[0].equals("tex")) { conversor = new ConversorTeX(); } else { conversor = new ConversorASCII(); } LeitorRTF leitor = new LeitorRTF(conversor); leitor.lerRTF(); } } Padrões GoF de Criação - Builder BUIDER Comparado ao Abstract Factory Ambos podem ser utilizados para a construção de objetos complexos. A principal diferença entre eles é que o Builder constrói objetos complexos passo a passo e o Abstract Factory constrói famílias de objetos, simples ou complexos, de uma só vez. Padrões GoF de Criação - Singleton Propósito Garantir que uma classe tenha apenas uma única instância e fornecer um ponto de acesso centralizado a ela. Exemplo Um sistema pode ter apenas um gerenciador de janelas, ou gerenciador de impressão, ou então um único ponto de acesso ao banco de dados. Como fazer • A maneira de se fazer uma classe que possua uma única instância dela mesma é utilizar uma variável estática na classe, onde será guardada a referência para a instância corrente. • No caso do Singleton, a classe dever ter um construtor private, ou seja, ela não poderá ser instanciada diretamente. • Cada vez que esse método for chamado, ele deve checar se já existe uma instância da classe e retorná-la • caso contrário ele deve instanciar a classe, guardar a referência ao objeto no atributo estático da classe e então retorná-lo. Padrões GoF de Criação - Singleton public class DBConnectionPool { private static DBConnectionPool instance; private DBConnectionPool() { // cria conexões para o banco de dados } public synchronized static DBConnectionPool getInstance() { if( instance == null ) { instance = new DBConnectionPool(); } return instance; } public Connection getConnection() { Connection conn = null; //pega uma conexão livre ou uma nova conexão return conn; } public void releaseConnection( Connection conn ) { //libera a conexão de volta pro pool } } Padrões GoF de Criação - Prototype Objetivo: O padrão Prototype tem como objetivo criar objetos específicos a partir da instância de um protótipo. Isso permite criar novos objetos através da cópia deste protótipo. Padrões GoF de Criação - Prototype Estrutura 1. Client – solicita a um protótipo a criação de uma cópia de si mesmo, gerando outro objeto. 2. Prototype – especifica uma interface para clonar a si próprio. 3. Concrete Prototype – implementa uma operação para clonar a si próprio Padrões GoF de Criação - Prototype Utilização • Sistemas que possuem componentes cujo estado inicial possui poucas variações e onde é conveniente disponibilizar um conjunto pré- estabelecido de protótipos que dão origem aos objetos que compõem o sistema. Vantagens • Criação de novos objetos através da variação de valores. • Poder aproveitar o estado existente de um objeto. Padrões GoF de Criação - Prototype public abstract class CarroPrototype { protected double valorCompra; public abstract String exibirInfo(); public abstract CarroPrototype clonar(); public double getValorCompra() { return valorCompra; } public void setValorCompra(double valorCompra) { this.valorCompra = valorCompra; } } public class FiestaPrototype extends CarroPrototype { protected FiestaPrototype(FiestaPrototype fiestaPrototype) { this.valorCompra = fiestaPrototype.getValorCompra(); } public FiestaPrototype() { valorCompra = 0.0; } @Override public String exibirInfo() { return "Modelo: Fiesta\nMontadora: Ford\n" + "Valor: R$" + getValorCompra(); } @Override public CarroPrototype clonar() { return new FiestaPrototype(this); } } public static void main(String[] args) { FiestaPrototype prototipoFiesta = new FiestaPrototype(); CarroPrototype fiestaNovo = prototipoFiesta.clonar(); fiestaNovo.setValorCompra(27900.0); CarroPrototype fiestaUsado = prototipoFiesta.clonar(); fiestaUsado.setValorCompra(21000.0); System.out.println(fiestaNovo.exibirInfo()); System.out.println(fiestaUsado.exibirInfo()); } Padrões GoF - Estruturais • Tem como objetivo estabelecer soluções para que classes e objetos possam formar estruturas maiores. ADAPTER COMPOSITE FACADE DECORATE BRIDGE FLYWEIGHT PROXY • Classificação Classe e Objeto • Propósito Converte a interface de uma classe em outra interface, esperada pelos clientes. Permite que classes com interfaces incompatíveis trabalhem em conjunto • Motivação • Algumas vezes, uma classe de um toolkit não é reutilizada porque sua interface não corresponde a uma interface requerida por uma aplicação específica Padrões GoF Estruturais - ADAPTER • Meu sistema já possui classes implementadas e testadas (Cliente A e Coelce) que agora devem se comunicar. • Entretanto Cliente A requer uma interface diferente da classe Coelce, que não pode ser modificada Padrões GoF Estruturais - ADAPTER Classe Adapter• Usa herança múltipla (ou implementação de interface) • Client: colabora com objetos compatíveis com a interface de Target • Target: define interface específica do domínio • Adaptee: define interface existente que requer adaptação • Adapter: adapta a interface de Adaptee à interface de Target Padrões GoF Estruturais - ADAPTER Energia getEnergiaEm110V(){ Return c.getEnergiaEm220V(); } Padrões GoF Estruturais - ADAPTER Classe Adapter - solução • Adaptador de classes - consequências: •Utiliza uma classe concreta para adaptar Adaptee a Target •Permite sobrescrever algum comportamento de Adaptee, pois Adapter é subclasse de Adaptee Padrões GoF Estruturais - ADAPTER Objeto Adapter •Usa composição de objetos • Client: chama operações em uma instância de Adapter •Adapter: chama operações de Adaptee que executa a solicitação Padrões GoF Estruturais - ADAPTER • Adaptador de objetos - consequências: •Permite que um único Adapter trabalhe com muitos Adaptees (Adapter e suas subclasses) •Adapter pode acrescentar novas funcionalidades a todos os Adaptees de uma só vez •É mais difícil redefinir um comportamento de Adaptee, pois é necessário criar e referenciar subclasses de Adaptee Padrões GoF Estruturais - ADAPTER • Classificação Estrutural de Objeto • Propósito Anexar responsabilidades adicionais a um objeto dinamicamente Decorators oferecem uma alternativa flexível ao uso de herança para estender uma funcionalidade • Também conhecido como • Wrapper Padrões GoF Estruturais - DECORATOR I- Como fazer para calcular a conta? Bill +beverages+calculateBill() II- Se acrescentássemos os topos (leite, chocolate, chantilly)? Padrões GoF Estruturais - DECORATOR Excelente! Padrões GoF Estruturais - DECORATOR Motivação: Em algumas situações o uso de hierarquias para descrever comportamento pode causar combinações exponenciais • Herança não resolve sempre! Aplicabilidade: • Para adicionar responsabilidades a objetos dinamicamente e transparentemente, ou seja, sem afetar outro objeto • Quando não é possível estender subclasses • Às vezes, um grande número de extensões independentes, são possíveis mas podem causar uma explosão de subclasses para suportar todas as combinações Padrões GoF Estruturais - DECORATOR Participantes: •Component define a interface para objetos que podem ter responsabilidades acrescentadas a eles dinamicamente • ConcreteComponent define um objeto para o qual responsabilidades adicionais podem ser atribuídas •Decorator mantém uma referência para um objeto Component e define uma interface que segue a interface de Component •ConcretDecorator acrescenta responsabilidades ao componente Padrões GoF Estruturais - DECORATOR Padrões GoF Estruturais - DECORATOR Como funciona o método cost()? Padrões GoF Estruturais - DECORATOR Cálculo do custo Padrões GoF Estruturais - DECORATOR Exemplo de código Imagine uma aplicação para montagens de veículos. O cliente irá escolher o veículo desejado na aplicação e será redirecionado a outra página em que poderá escolher que produtos gostaria de adicionar no veículo, como ar condicionado e trava elétrica, e dessa forma simular o preço final do veículo escolhido. Padrões GoF Estruturais - DECORATOR Padrões GoF Estruturais - DECORATOR public interface Carro { public double getCusto(); public String getDescricao(); public String getProdutos(); } Padrões GoF Estruturais - DECORATOR public abstract class CarroDecorator implements Carro{ protected Carro carroDecorado; public CarroDecorator(Carro CarroDecorator) { this.carroDecorado = CarroDecorator; } @Override public double getCusto() { return carroDecorado.getCusto(); } @Override public String getDescricao() { return carroDecorado.getDescricao(); } @Override public String getProdutos() { return carroDecorado.getProdutos(); } } Padrões GoF Estruturais - DECORATOR public class CarroComArCondicionado extends CarroDecorator{ private double custo; private String produtos; public CarroComArCondicionado(Carro CarroDecorator) { super(CarroDecorator); this.custo = 900.00; this.produtos = "Ar Condicionado"; } @Override public double getCusto() { return super.getCusto() + custo; } @Override public String getDescricao() { return super.getDescricao(); } @Override public String getProdutos() { return super.getProdutos() + ", "+ produtos; } } Padrões GoF Estruturais - DECORATOR public class CarroComTravaEletrica extends CarroDecorator { private double custo; private String produtos; public CarroComTravaEletrica(Carro CarroDecorator) { super(CarroDecorator); this.custo = 400.00; this.produtos = "Trava Elétrica"; } @Override public double getCusto() { return super.getCusto() + custo; } @Override public String getDescricao() { return super.getDescricao(); } @Override public String getProdutos() { return super.getProdutos() + ", "+ produtos; } } Padrões GoF Estruturais - DECORATOR public class CrossFox implements Carro{ private double custo = 40000.00; private String produto = "Cross Fox 1.6"; private String descricao = " Novo carro da WV com cambio automático"; @Override public double getCusto() { return custo; } @Override public String getDescricao() { return descricao; } @Override public String getProdutos() { return produto; } } Padrões GoF Estruturais - DECORATOR public class Main { public static void main(String[] args) { Carro carro = new CrossFox(); System.out.println("Produto: " + carro.getProdutos()); System.out.println("Preço: R$ " + carro.getCusto()); // Adiconando Ar e Travas carro = new CarroComArCondicionado(carro); carro = new CarroComTravaEletrica(carro); System.out.println("Produto: " + carro.getProdutos()); System.out.println("Preço: R$ " + carro.getCusto()); } } Padrões GoF de Estruturais - DECORATOR Padrões GoF de Estruturais - COMPOSITE "Compor objetos em estruturas de árvore para representar hierarquias todo-parte. Composite permite que clientes tratem objetos individuais e composições de objetos de maneira uniforme.” Exemplo : uniformizar o acesso aos arquivos e pastas. A ideia do Composite é criar uma classe base que contém toda a interface necessária para todos os elementos e criar um elemento especial que agrega outros elementos. Padrões GoF de Estruturais - COMPOSITE A classe base Arquivo implementa todos os métodos necessários para arquivos e pastas. Padrões GoF Estruturais - COMPOSITE public abstract class ArquivoComponent { String nomeDoArquivo; public void printNomeDoArquivo() { System.out.println(this.nomeDoArquivo); } public String getNomeDoArquivo() { return this.nomeDoArquivo; } public void adicionar(ArquivoComponent novoArquivo) throws Exception { throw new Exception("Não pode inserir arquivos em: " + this.nomeDoArquivo + " - Não é uma pasta"); } public void remover(String nomeDoArquivo) throws Exception { throw new Exception("Não pode remover arquivos em: " + this.nomeDoArquivo + " -Não é uma pasta"); } public ArquivoComponent getArquivo(String nomeDoArquivo) throws Exception { throw new Exception("Não pode pesquisar arquivos em: " + this.nomeDoArquivo + " - Não é uma pasta"); } } Padrões GoF Estruturais - COMPOSITE public class ArquivoVideo extends ArquivoComponent { public ArquivoVideo(String nomeDoArquivo) { this.nomeDoArquivo = nomeDoArquivo; } } na classe que representa a Pasta é necessário sobrescrever o comportamento padrão e repassar a chamada para todos os arquivos, sejam arquivos ou pastas. para criar um arquivo de vídeo por exemplo, bastaimplementar o construtor: Padrões GoF de Estruturais - COMPOSITE public class ArquivoComposite extends ArquivoComponent { ArrayList<ArquivoComponent> arquivos = new ArrayList<ArquivoComponent>(); public ArquivoComposite(String nomeDoArquivo) { this.nomeDoArquivo = nomeDoArquivo;} @Override public void printNomeDoArquivo() { System.out.println(this.nomeDoArquivo); for (ArquivoComponent arquivoTmp : arquivos) { arquivoTmp.printNomeDoArquivo(); } } @Override public void adicionar(ArquivoComponent novoArquivo) { this.arquivos.add(novoArquivo); } @Override public void remover(String nomeDoArquivo) throws Exception { for (ArquivoComponent arquivoTmp : arquivos) { if (arquivoTmp.getNomeDoArquivo() == nomeDoArquivo) { this.arquivos.remove(arquivoTmp); return; } } throw new Exception("Não existe este arquivo"); } @Override public ArquivoComponent getArquivo(String nomeDoArquivo) throws Exception { for (ArquivoComponent arquivoTmp : arquivos) { if (arquivoTmp.getNomeDoArquivo() == nomeDoArquivo) { return arquivoTmp; } } throw new Exception("Não existe este arquivo"); } } Padrões GoF de Estruturais - COMPOSITE public static void main(String[] args) { ArquivoComponent minhaPasta = new ArquivoComposite("Minha Pasta/"); ArquivoComponent meuVideo = new ArquivoVideo("meu video.avi"); ArquivoComponent meuOutroVideo = new ArquivoVideo("serieS01E01.mkv"); minhaPasta.adicionar(meuVideo); minhaPasta.adicionar(meuOutroVideo); minhaPasta.printNomeDoArquivo(); minhaPasta.getArquivo(meuVideo.getNomeDoArquivo()) minhaPasta.remover(meuVideo.getNomeDoArquivo()); minhaPasta.printNomeDoArquivo(); } Padrões GoF de Estruturais - Facade Objetivo: • Fornecer uma interface unificada para um conjunto de interfaces em um subsistema. • Esta interface de nivel mais alto permite uma maior facilidade na utilização do subsistema Motivação: • Estruturar um sistema em subsistemas ajuda a reduzir a complexidade. Um objetivo comum de projetos é minimizar a comunicação e as dependências entre subsistemas Padrões GoF de Estruturais - Facade Padrões GoF de Estruturais - Facade /* Partes complexas */ class CPU { public void freeze() { ... } public void jump(long position) { ... } public void executar() { ... } } class Memoria { public void load(long position, byte[] data) { ... } } class HardDrive { public byte[] read(long lba, int tamanho) { ... } } /* Façade */ class Computador { private CPU cpu; private Memoria memoria; private HardDrive hardDrive; public Computador() { this.cpu = new CPU(); this.memoria = new Memoria(); this.hardDrive = new HardDrive(); } public void ligarComputador() { cpu.freeze(); memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE)); cpu.jump(BOOT_ADDRESS); cpu.executar(); } } Padrões GoF de Estruturais - Facade /* Client */ class Voce { public static void main(String[] args) { Computador facade = new Computador(); facade.ligarComputador(); } } Padrões GoF de Estruturais - Bridge Objetivo: • “Desacoplar uma abstração da sua implementação, de modo que as duas possam variar independentemente.” • A intenção do padrão Bridge é desacoplar um conjunto de implementações do conjunto de objetos que as utilizam. Padrões GoF de Estruturais - Bridge Estrutura: Padrões GoF de Estruturais - Bridge Quando utilizar: Deve ser utilizado quando for necessário evitar ligação permanente entre a interface e a implementação, para que alterações não afetem os clientes. Padrões GoF de Estruturais - Bridge Exemplo: public interface JanelaImplementada { void desenharJanela(String titulo); void desenharBotao(String titulo); } public class JanelaWindows implements JanelaImplementada { @Override public void desenharJanela(String titulo) { System.out.println(titulo + " - Janela Windows"); } @Override public void desenharBotao(String titulo) { System.out.println(titulo + " - Botão Windows"); } } Padrões GoF de Estruturais - Bridge Exemplo: public abstract class JanelaAbstrata { 02 03 protected JanelaImplementada janela; 04 05 public JanelaAbstrata(JanelaImplementada j) { 06 janela = j; 07 } 08 09 public void desenharJanela(String titulo) { 10 janela.desenharJanela(titulo); 11 } 12 13 public void desenharBotao(String titulo) { 14 janela.desenharBotao(titulo); 15 } 16 17 public abstract void desenhar(); 18 19 } Padrões GoF de Estruturais - Bridge public class JanelaDialogo extends JanelaAbstrata { public JanelaDialogo(JanelaImplementada j) { super(j); } @Override public void desenhar() { desenharJanela("Janela de Diálogo"); desenharBotao("Botão Sim"); desenharBotao("Botão Não"); desenharBotao("Botão Cancelar"); } } public class JanelaDialogo extends JanelaAbstrata { public JanelaDialogo(JanelaImplementada j) { super(j); } @Override public void desenhar() { desenharJanela("Janela de Diálogo"); desenharBotao("Botão Sim"); desenharBotao("Botão Não"); desenharBotao("Botão Cancelar"); } } Padrões GoF de Estruturais - Bridge public static void main(String[] args) { JanelaAbstrata janela = new JanelaDialogo(new JanelaLinux()); janela.desenhar(); janela = new JanelaAviso(new JanelaLinux()); janela.desenhar(); janela = new JanelaDialogo(new JanelaWindows()); janela.desenhar(); } Padrões GoF de Estruturais - Flyweight Objetivo • É utilizado para otimização na existência de muitos objetos com as mesmas características intrínsecas (são estáticas e não depende do estado do objeto). • Para reduzir o processamento lento da execução destes muitos objetos repetidos, a estruturação faz com que alguns destes dados sejam externos em um objeto, simulando assim a existência de mais objetos do que o realmente existente; com esta diminuição de objetos podemos criar uma execução mais rápida. Padrões GoF de Estruturais - Flyweight Estrutura Padrões GoF de Estruturais - Flyweight Exemplo Padrões GoF Comportamentais – Proxy Objetivo: “Fornecer um substituto ou marcador da localização de outro objeto para controlar o acesso a esse objeto.” Vantagem: • Ao utilizar um substituto, pode-se fazer desde operações otimizadas até proteção do acesso ao objeto. • Transparência, pois é utilizada a mesma sintaxe na comunicação entre o cliente e o objeto real; Padrões GoF Comportamentais – Proxy Quando utilizar: • O padrão Proxy é utilizado quando um sistema quer utilizar um objeto real, mas por algum motivo ele não está disponível. • A solução então é providenciar um substituto que possa se comunicar com esse objeto quando ele estiver disponível. • O cliente passa a usar o intermediário em vez do objeto real. O intermediário possui uma referencia para o objeto real e repassa asinformações do cliente, filtrando dados e acrescentando informações. Padrões GoF Comportamentais – Proxy Exemplo: controlar o acesso aos objetos verificando se quem chama possui a devida permissão. Padrões GoF Comportamentais Chain of Responsability: Evita o acoplamento do remetente de uma solicitação ao seu destinatário, dando a mais de um objeto a chance de tratar a solicitação. Encadeia os objetos receptores e passa a solicitação ao longo da cadeia até que um objeto a trate. Command: Encapsula uma solicitação como um objeto, desta forma permitindo que você parametrize clientes com diferentes solicitações, enfileire ou registre (log) solicitações e suporte operações que podem ser desfeitas. Interpreter: Dada uma linguagem, define uma representação para sua gramática juntamente com um interpretador que usa a representação para interpretar sentenças nesta linguagem. Iterator: Cria um iterador para interagir com os objetos, retirando a iteração das responsabilidades do próprio objeto.Padrões GoF Comportamentais Mediator: Define um objeto que encapsula como um conjunto de objetos interage. O Mediator promove o acoplamento fraco ao evitar que os objetos se refiram explicitamente uns aos outros, permitindo que você varie suas interações independentemente. Memento: Sem violar a encapsulação, captura e externaliza um estado interno de um objeto, de modo que o mesmo possa posteriormente ser restaurado para este estado. Observer: Define uma dependência um-para-muitos entre objetos, de modo que, quando um objeto muda de estado, todos os seus dependentes são automaticamente notificados e atualizados. Padrões GoF Comportamentais State: Permite que um objeto altere seu comportamento quando seu estado interno muda. O objeto parecerá ter mudado de classe. Strategy: Define uma família de algoritmos, encapsula cada um deles e os faz intercambiáveis. O Strategy permite que o algoritmo varie independentemente dos clientes que o utilizam. Template Method: Define o esqueleto de um algoritmo em uma operação, postergando a definição de alguns passos para subclasses. O Template Method permite que as subclasses redefinam certos passos de um algoritmo sem mudar sua estrutura. Visitor: Representa uma operação a ser executada sobre os elementos da estrutura de um objeto. O Visitor permite que você defina uma nova operação sem mudar as classes dos elementos sobre os quais opera, criando métodos virtualmente. Padrões GoF Comportamentais - Strategy Propósito • Definir uma família de algoritmos, encapsular cada um, e fazê-los intercambiáveis. • Strategy permite que algoritmos variem independentemente entre clientes que os utilizam. Aplicabilidade • Quando muitas classes relacionadas diferem apenas no comportamento • Quando variações de um algoritmo são necessárias e quando esses algoritmos puderem ser reutilizados • Quando um algoritmo utilizar informações que não devem ser conhecidas pelo cliente • Quando uma classe define muitos comportamentos, e esses aparecem como múltiplo comandos condicionais • Diferentes algoritmos são apropriados para diferentes aplicações. • Tornar o algoritmo parte do cliente dificulta adição de novos algoritmos. Padrões GoF Comportamentais - Strategy Consequências Positivas • Uma alternativa à herança. Deixando o código mais limpo, fácil de entender e manter. • Possibilidade de variar algoritmos dinamicamente • O encapsulamento de algoritmos em classes separadas permite variações de algoritmo independente do Contexto. • Eliminação de comandos condicionais. Consequências Negativas • Mais objetos no Projeto • Clientes devem ter conhecimento dos diferentes tipos de estratégia, ou seja, só devemos utilizar Strategy quando a mudança de comportamento for relevante para os clientes Padrões GoF Comportamentais - Strategy Estrutura Padrões GoF Comportamentais - Strategy Participantes: – Strategy (Compositor) • Define uma interface comum para todos os algoritmos suportados. Context usa esta interface para chamar o algoritmo definido por uma ConcreteStrategy. – ConcreteStrategy • Implementa o algoritmo usando a interface de Strategy. – Context (Composition) • É configurado com um objeto ConcreteStrategy; • Mantém uma referência para um objeto Strategy; Padrões GoF Comportamentais - Strategy Padrões GoF Comportamentais - State Definição: permite que um objeto altere o seu comportamento quando um estado interno muda. Aplicabilidade: • o comportamento de um objeto depende do seu estado e ele pode mudar seu comportamento em tempo de execução, dependendo desse estado; • operações que tem comandos condicionais grandes, de várias alternativas e que dependem do estado do objeto. Frequentemente, várias operações conterão essa mesma estrutura condicional. Padrões GoF Comportamentais - State Estrutura Padrões GoF Comportamentais - State Participantes: • Context é a interface que será usada pelo clientes, Context mantém uma instância do objeto que implementa a interface State corrente. • State é a interface que deverá ser implementada para definir comportamentos. • Concrete State Subclasse que implementa um comportamento associado ao estado de contexto. Padrões GoF Comportamentais - State Exemplo: Controle Bancário Padrões GoF Comportamentais – Chain of Responsability Propósito: permitir que mais de uma classe tenha a chance de atender a uma requisição de serviço. As classes são encadeadas e fracamente acopladas, pois o único vínculo que possuem é o link para a chamada das outras classes na cadeia Padrões GoF Comportamentais – Chain of Responsability • Quando um cliente emite uma solicitação, esta se propaga ao longo da cadeia até que um objeto Handler assuma a responsabilidade de tratá- la. Padrões GoF Comportamentais – Chain of Responsability • Estrutura Padrões GoF Comportamentais – Chain of Responsability Participantes: Handler: Define uma interface para tratar solicitações Implementa o link para o sucessor ConcreteHandler: Trata as solicitações em que for o responsável. Pode acessar seu sucessor, caso a solicitação não seja de sua responsabilidade Client: Inicia a solicitação, que vai para algum objeto ConcreteHandler na cadeia. Padrões GoF Comportamentais – Chain of Responsability Consequências do uso: 1 - Redução de acoplamento: Um objeto não tem que saber que outros objetos tratam uma solicitação. 2 - Objetos mantêm referências apenas para o sucessor e não para todos os receptores candidatos. 3 - Flexibilidade adicional na atribuição de responsabilidade: É possível acrescentar ou mudar responsabilidades em tempo de execução. 4 – A recepção não é garantida: Uma vez que uma solicitação não tem receptor explícito, não há total garantia de que ela será tratada. Se uma classe não for implementada corretamente também não há garantia de tratamento da solicitação. Padrões GoF Comportamentais – Chain of Responsability abstract class Approver { protected Approver successor; public void SetSuccessor(Approver successor) { this.successor = successor; } public abstract void ProcessRequest(Purchase purchase); } /// <summary> /// The 'ConcreteHandler' class /// </summary> class Director : Approver { public override void ProcessRequest(Purchase purchase) { if (purchase.Amount < 10000.0) { Console.WriteLine("{0} approved request# {1}", this.GetType().Name, purchase.Number); } else if (successor != null) { successor.ProcessRequest(purchase); } } } class VicePresident : Approver { public override void ProcessRequest(Purchase purchase) { if (purchase.Amount < 25000.0) { Console.WriteLine("{0} approved request# {1}", this.GetType().Name, purchase.Number); } else if (successor != null) { successor.ProcessRequest(purchase); } } } /// <summary> /// The 'ConcreteHandler' class /// </summary> class President : Approver { public override void ProcessRequest(Purchase purchase) { if (purchase.Amount < 100000.0) { Console.WriteLine("{0} approved request# {1}", this.GetType().Name, purchase.Number); } else { Console.WriteLine( "Request# {0} requires an executive meeting!", purchase.Number); } } Padrões GoF Comportamentais – Chain of Responsability class Purchase { private int _number; private double _amount; private string _purpose; // Constructor public Purchase(int number, double amount, string purpose) { this._number = number; this._amount = amount; this._purpose = purpose; } // Gets or sets purchase number public int Number { get { return _number; } set { _number = value; } } // Gets or sets purchase amount public double Amount { get { return _amount; } set { _amount = value; } } // Gets or sets purchase purpose public string Purpose { get { return _purpose;} set { _purpose = value; } } } } Padrões GoF Comportamentais – Chain of Responsability class MainApp { static void Main() { // Setup Chain of Responsibility Approver larry = new Director(); Approver sam = new VicePresident(); Approver tammy = new President(); larry.SetSuccessor(sam); sam.SetSuccessor(tammy); // Generate and process purchase requests Purchase p = new Purchase(2034, 350.00, "Assets"); larry.ProcessRequest(p); p = new Purchase(2035, 32590.10, "Project X"); larry.ProcessRequest(p); p = new Purchase(2036, 122100.00, "Project Y"); larry.ProcessRequest(p); // Wait for user Console.ReadKey(); } Padrões GoF Comportamentais – Command Definição: "Encapsular uma requisição como um objeto, permitindo que clientes parametrizem diferentes requisições e suportar operações reversíveis." [GoF] Objetivo: • Encapsular solicitações em um objeto e utilizar suas ações sem conhecer sua implementação; • Possibilitar operações de fazer e desfazer; Padrões GoF Comportamentais – Command Objetivo: • Encapsular uma solicitação como um objeto, permitindo que clientes sejam configurados para tratar diferentes solicitações, log de solicitações e suportar capacidade de desfazer operações. Motivação: • Algumas vezes é necessário solicitar uma operação sem nenhum conhecimento de como esta será implementada; • Podemos simplesmente não conhecer o objeto que vai receber a delegação para executar aquela operação; Solução: • encapsular esta tarefa num objeto (um Command) e através dele delegar esta tarefa para outra classe, que por sua vez sabe como executar a operação propriamente dita (o Receiver); Padrões GoF Comportamentais – Command Consequência: • Promove o desacoplamento do objeto que solicita uma operação do objeto que vai realizar esta operação propriamente dita; • Solicitações em alto nível: o objeto não precisa ter nenhum conhecimento sobre a implementação da operação; • Commands podem ser manipulados e estendidos com qualquer outro objeto. • É fácil adicionar novos Commands porque não é necessário modificar classes existentes. Padrões GoF Comportamentais – Command Diagrama de Classe Padrões GoF Comportamentais – Command Participantes: • Command: Interface para execução de uma operação; • ConcreteCommand: Vincula um objeto Receiver a uma ação e implementa os métodos abstratos da classe Command; • Client: Cria um objeto ConcreteCommand e estabelece o seu Receiver; • Invoker: Envia solicitações ao Command; • Receiver: Implementa as ações que serão utilizadas pelo ConcreteCommand; Padrões GoF Comportamentais – Command Exemplo: Command Execute() PasteCommand buffer Execute() Cola o buffer no documento. OpenCommand Execute() QuitCommand Execute() Abre uma caixa de diálogo para perguntar ao usuário o nome do documento e adiciona o mesmo à aplicação. Se o documento foi modificado salve o documento. Caso contrário saia da aplicação. Padrões GoF Comportamentais – Command • A classe abstrata Command declara uma interface para executar operações. Na sua forma mais simples, essa interface possui uma operação abstrata Execute( ). • Subclasses de Command (Concrete Commands) implementam a operação Execute( ) de diferentes maneiras para atender aos diversos tipos de operações. Padrões GoF Comportamentais – Command Exemplo: Portão de garagem Padrões GoF Comportamentais – Observer Propósito: • Permitir que um objeto sujeito mantenha uma lista com seus dependentes, chamados de observadores, e possa notificá-los automaticamente de eventuais mudanças de estado, geralmente chamando um de seus métodos. • Também conhecido como: Dependents, Publish-Subscribe, Event-Generator Aplicabilidade • Quando o objeto sujeito não sabe exatamente quantos objetos de observação tem. • Quando o objeto sujeito deve ser capaz de informar seus objetos observadores sem saber quem são esses objetos. Padrões GoF Comportamentais – Observer Consequências Positivas • O Subject faz broadcast da notificação. Os Observers têm total liberdade para fazer o que quiserem, inclusive nada. • Fraco Acoplamento. Consequência Negativas • O custo de uma mudança ao estado de um Subject pode ser grande se houver muitos Listeners. Padrões GoF Comportamentais – Observer Diagrama: Padrões GoF Comportamentais – Observer • Subject : Conhece seus Observers. Qualquer número de objetos pode observar um Subject Provê uma interface para adicionar e remover Observers. • Observer: Define uma interface para objetos que recebem avisos de mudança de estado de um Subject. • ConcreteObserver : implementa a interface Observer para manter seu estado consistente com o Subject. Padrões GoF Comportamentais – Observer Exemplo: estação meteorológica Padrões GoF Comportamentais – Template Method Objetivo • Define o esqueleto de um algoritmo em uma operação, deixando alguns passos para serem implementados por subclasses. • O Template Method deixa subclasses redefinirem certos passos de um algoritmo sem alterar a estrutura do algoritmo Aplicabilidade • Para implementar as partes invariantes de um algoritmo uma única vez e deixar que as subclasses implementem o comportamento que pode variar. • Quando comportamento comum entre subclasses deve ser fatorado e locado em uma classe comum para evitar duplicação de código. Padrões GoF Comportamentais – Template Method Conseqüências • Template Methods constituem uma técnica fundamental para a reutilização de código. São particularmente importantes para Biblioteca de Classes, pois representam um mecanismo para fatorar comportamento comum. • Templates Methods levam a uma inversão de controle. Também chamado de “Hollywood principle”, “Don´t call us, we´ll call you” Padrões GoF Comportamentais – Template Method Estrutura Participantes ClasseAbstrata : Define operações primitivas abstratas que as subclasses concretas definem para implementar passos de um algoritmo ClasseConcreta : Implementa as operações abstratas para desempenhar as etapas do algoritmo que tenham comportamento específico a esta classe Padrões GoF Comportamentais – Template Method Exemplo: Financiamento imobiliário Padrões GoF Comportamentais – Visitor Objetivo • Aumentar a coesão das classes isolando em outras classes tarefas pouco coesas • Visitor permite definir uma nova operação sem alterar as classes dos elementos nos quais a operação atua Implementação • Faça com que cada elemento aceite um objeto "visitante" e o chame através de um método apropriado Padrões GoF Comportamentais – Visitor • Quando usar o padrão Visitor? • Uma estrutura de objetos contém muitas classes de objetos com interfaces diferentes e se deseja realizar operações nestes objetos que dependem das classes concretas • Muitas operações distintas e não relacionadas devem ser realizadas numa estrutura de objetos e deseja-se evitar "poluir" as classes com estas operações. Visitor permite que se agrupe as operações relacionadas numa mesma classe Padrões GoF Comportamentais – Visitor Estrutura Padrões GoF Comportamentais – Visitor Exemplo 1: Em uma ferramenta Case deve ser possível gerar as informações de casos de uso e classes em HTML, PDF, RTF, TeX, etc. Entretanto, não é desejável que a classe que representa um caso de uso tenha métodos para cada tipo de geração. Exemplo 2: Padrões GoF Comportamentais – Memento Objetivo: • Permitir que um objeto volte ao seu estado anterior em operações de "undo" ou "redo". Implementação: • O cliente solicita um Memento do objeto de origem quando ele precisa de ponto de verificação do estado doobjeto de origem. • O objeto de origem inicializa o Memento com uma caracterização de seu estado. Padrões GoF Comportamentais – Memento Estrutura Originator – O objeto que conhece como se salvar Caretaker – O objeto que conhece quando the Originator precisa se salvar e restaurar. Memento – guarda o estado que é escrito e lido pelo Originator. Padrões GoF Comportamentais – Memento Exemplo: Padrões GoF Comportamentais – Interator • Objetivo • Prover uma forma de sequencialmente acessar os elementos de uma coleção sem expor sua representação interna. Também conhecido como Cursor. • Motivação • Queremos isolar o uso de uma estrutura de dados de sua representação interna de forma a poder mudar a estrutura sem afetar quem a usa. • Para determinadas estruturas, pode haver formas diferentes de caminhamento e queremos encapsular a forma exata de caminhamento Padrões GoF Comportamentais – Interator • A idéia do iterador é de retirar da coleção a responsabilidade de acessar e caminhar na estrutura e colocar a responsabilidade num novo objeto separado chamado um iterador • A interface Iterador: Define uma interface para acessar os elementos da coleção • A classe Iterador: Implementa a interface Iterador Padrões GoF Comportamentais – Interator Aplicabilidade • Para acessar o conteúdo de uma coleção sem expor suas representação interna • Para suportar múltiplas formas de caminhamento • Para prover uma interface única para varrer coleções diferentes Padrões GoF Comportamentais – Interator Estrutura Padrões GoF Comportamentais – Interator • Exemplo: Padrões GoF Comportamentais – Mediator Objetivo: Definir um objeto que encapsula a forma como um conjunto de objetos interage. O Mediator promove o acoplamento fraco ao evitar que os objetos se refiram uns aos outros explicitamente e permitir variar suas interações independentemente. Problema • Como permitir que um grupo de objetos se comunique entre si sem que haja acoplamento entre eles ? • Como remover o forte acoplamento presente em relacionamentos muitos para muitos ? Padrões GoF Comportamentais – Mediator Solução • Introduzir um mediator : Objetos podem se comunicar sem se conhecer. • Um objeto Mediador deve encapsular toda a comunicação entre um grupo de objetos • Cada objeto participante conhece o mediador mas ignora a existência dos outros objetos; • O mediador conhece cada um dos objetos participantes; • A interface do Mediador é usada para iniciar a comunicação e receber notificações • O mediador recebe requisições dos remetentes; • O mediador repassa as requisições aos destinatários; Padrões GoF Comportamentais – Mediator Estrutura Padrões GoF Comportamentais – Mediator Participantes (Classes) • Mediator - Define uma interface para comunicação com os objetos Colleague; • ConcreteMediator - Conhece as classes Colleague e implementa a comunicação e transferência de mensagens entre as classes Colleague; • Classes Colleague - Mantém uma referência ao seu objeto Mediator . Se comunicam com o Mediator sempre que necessário; Padrões GoF Comportamentais – Mediator Participantes (Classes) • Mediator - Define uma interface para comunicação com os objetos Colleague; • ConcreteMediator - Conhece as classes Colleague e implementa a comunicação e transferência de mensagens entre as classes Colleague; • Classes Colleague - Mantém uma referência ao seu objeto Mediator . Se comunicam com o Mediator sempre que necessário; Padrões GoF Comportamentais – Mediator Vantagens • Desacoplamento entre os diversos participantes da rede de comunicação: participantes não se conhecem; • Eliminação de relacionamentos muitos para muitos (são todos substituídos por relacionamentos um para muitos); • A política de comunicações está centralizada no mediador e pode ser alterada sem mexer nos colaboradores; Desvantagens • A centralização pode ser uma fonte de gargalos de desempenho e de risco para o sistema em caso de falha; • Na prática os mediadores tendem a se tornarem mais complexos; Padrões GoF Comportamentais – Mediator Exemplo: • um aplicativo que trocasse mensagem entre diversas plataformas móveis, um Android enviando mensagem para um iOS, um Symbian trocando mensagens com um Android. O problema é que cada uma destas plataforma implementa maneiras diferentes de receber mensagens e não seria uma boa solução criar vários métodos para cada uma das plataformas. Padrões GoF Comportamentais – Interpreter Objetivo: “O padrão Interpreter recebe uma linguagem e define uma representação para sua gramática junto com um interpretador que usa a representação para interpretar sentenças na linguagem”. (ROCHA, 2003). Padrões GoF Comportamentais – Interpreter Estrutura: Padrões GoF Comportamentais – Interpreter Exemplo: converter uma String ,representando um número romano, em um inteiro que represente seu valor decimal. Padrões GoF Comportamentais – Interpreter Exemplo: converter uma String ,representando um número romano, em um inteiro que represente seu valor decimal.
Compartilhar