Baixe o app para aproveitar ainda mais
Prévia do material em texto
PADRÕES DE PROJETO DE SOFTWARE Aula 4 – Padrões estruturais GoF PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE O que veremos nesta terceira aula Continuar estudando padrões estruturais; Conhecer os padrões de estruturais Façade, Proxy e Flyweight; Aprender as principais aplicações e funcionalidades destes padrões. PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Classificação dos padrões GoF segundo Metsker [2] PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Proxy "Prover um substituto ou ponto através do qual um objeto possa controlar o acesso a outro." [GoF] PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Problema Sistema quer utilizar objeto real... Mas ele não está disponível (remoto, inaccessível, ...) Solução: arranjar um intermediário que saiba se comunicar com ele eficientemente PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Prós e contras Vantagens Transparência: mesma sintaxe usada na comunicação entre o cliente e sujeito real é usada no proxy Permite o tratamento inteligente dos dados no cliente Permite maior eficiência com caching no cliente Desvantagens Possível impacto na performance Transparência nem sempre é 100% (fatores externos como queda da rede podem tornar o proxy inoperante ou desatualizado) PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Exemplo 2 import java.util.*; public interface Imagem { public void mostrarImagem(); } PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Continuação Exemplo 2 // no Sistema A public class ImagemReal implements Imagem { private String nomeDoArquivo; public ImagemReal(String nomeDoArquivo) { this.nomeDoArquivo = nomeDoArquivo; carregarImagemDoDisco(); } private void carregarImagemDoDisco() { System.out.println("Carregando " + nomeDoArquivo); } public void mostrarImagem() { System.out.println("Mostrando " + nomeDoArquivo); } } PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Continuação Exemplo 2 // no Sistema B public class ImagemProxy implements Imagem { private String nomeDoArquivo; private Imagem imagem; public ImagemProxy(String nomeDoArquivo) { this.nomeDoArquivo = nomeDoArquivo; } public void mostrarImagem() { imagem = new ImagemReal(nomeDoArquivo); imagem.mostrarImagem(); } } PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Continuação Exemplo 2 public class ExemploProxy { public static void main(String[] args) { Imagem imagem1 = new ImagemProxy("ResOi_10MB_Foto1"); Imagem imagem2 = new ImagemProxy("ResOi_10MB_Foto2"); imagem1.mostrarImagem(); // necessário o carregamento imagem2.mostrarImagem(); // necessário o carregamento } } PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Façade "Oferecer uma interface única para um conjunto de interfaces de um subsistema. Façade define uma interface de nível mais elevado que torna o subsistema mais fácil de usar." [GoF] PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Quando usar? Sempre que for desejável criar uma interface para um conjunto de objetos com o objetivo de facilitar o uso da aplicação Permite que objetos individuais cuidem de uma única tarefa, deixando que a fachada se encarregue de divulgar as suas operações Façades e Singletons Fachadas frequentemente são implementadas como singletons PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Exemplo 2 /* Complex parts */ public class CPU { public void freeze() { ... } public void jump(long position) { ... } public void execute() { ... } } public class Memory { public void load(long position, byte[] data) { ... } } public class HardDrive { public byte[] read(long lba, int size) { ... } } PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Exemplo 2 /* Facade */ public class Computer { private CPU cpu; private Memory memory; private HardDrive hardDrive; public Computer() { this.cpu = new CPU(); this.memory = new Memory(); this.hardDrive = new HardDrive(); } public void startComputer() { cpu.freeze(); memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE)); cpu.jump(BOOT_ADDRESS); cpu.execute(); } } PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Exemplo 2 /* Client */ public class You { public static void main(String[] args) { Computer facade = new Computer(); facade.startComputer(); } } PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Flyweight "Usar compartilhamento para suportar grandes quantidades de objetos refinados eficientemente." [GoF] PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Problema PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Prós e contras Quando usar Flyweight Quando o tamanho do conjunto de objetos for significativamente menor que a quantidade de vezes em que eles são usados na aplicação Quando objetos podem ser usados em diferentes contextos ao mesmo tempo (agindo sempre como um objeto independente) Quando não usar Quando o estado dos objetos não for imutável (é preciso passar o estado mutável como parâmetro e isto pode ser impraticável se o estado consistir de vários objetos) Quando for necessário elaborar um algoritmo ou algo complicado para separar objetos mutáveis de imutáveis PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Exemplo //Flyweight public abstract class Flyweight { public abstract void Operation(int extrinsicstate); } PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Exemplo //ConcreteFlyweight public class ConcreteFlyweight extends Flyweight { public void Operation(int extrinsicstate) { System.out.println("ConcreteFlyweight :" + extrinsicstate ); } } PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Exemplo //FlyweightFactory import java.util.ArrayList; public class FlyweightFactory { ArrayList flyweights = new ArrayList(); public Flyweight GetFlyweight(int key) { if (flyweights.contains(key)){ return ((Flyweight) flyweights.get(key)); }else { Flyweight fly = new ConcreteFlyweight(); flyweights.add(key, fly); return fly; } } PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Exemplo //UnsharedConcreteFlyweight public class UnsharedConcreteFlyweight extends Flyweight { public void Operation(int extrinsicstate) { System.out.println("UnsharedConcreteFlyweight: " + extrinsicstate); } } PADRÕES ESTRUTURAIS GOF – AULA 4 PADRÕES DE PROJETO DE SOFTWARE Exemplo public class MainApp {//Main public static void main(String[] args) { int extrinsicstate = 22; // Estado extrínseco FlyweightFactory f = new FlyweightFactory(); Flyweight fx=f.GetFlyweight(0); //Trabalhando com diferentes intâncias flyweight fx.Operation(--extrinsicstate); Flyweight fy = f.GetFlyweight(1); fy.Operation(--extrinsicstate); Flyweight fz = f.GetFlyweight(2); fz.Operation(--extrinsicstate); Flyweight fw = f.GetFlyweight(3); fw.Operation(--extrinsicstate); UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight();uf.Operation(--extrinsicstate); } } PADRÕES ESTRUTURAIS GOF – AULA 4 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