Buscar

Aula_04

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]

Continue navegando