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(intextrinsicstate) { 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