Beruflich Dokumente
Kultur Dokumente
Sistemas de Informação I
Melina Mongiovi
melina@computacao.ufcg.edu.br
Polimorfismo
Passeio Passeio Passeio
Problema:
- explosão de subclasses
ComportamentoCalculo
Veiculo
supertipo
ComportamentoCalculo
CalculoHorario CalculoDiario
subtipos
public class Estacionamento2 {
private Veiculo veiculo;
private long inicio, fim;
public double valorConta() {
long atual = (fim == 0) ?
System.currentTimeMillis() : fim;
29
Como você descreveria a solução que
acabamos de ver, para um colega com um
problema parecido?
31
Consequências
contexto-problema-solução
melhorar o projeto de
edifícios e áreas urbanas
1994
2004
Padrões em software
Transferido para software em um livro
clássico: GoF (1994)
soluções recorrentes de classes e objetos
Padrões de projeto
Soluções para problemas de projeto OO
Previamente experimentados e testados
Resolvem problemas similares
ocorridos em vários contextos
enorme quantidade de publicações
O que é um Padrão de projeto?
class ListaPedidos {
public ListaPedidos(Pedido [] p) {
…
}
}
Definir uma única instância de uma classe
na memória
todos os serviços requisitados ao mesmo
objeto
private Gerenciador() {
... //construcao do objeto
}
private ListaPedido() {
... //construcao do objeto
}
private ListaPedido() {
... //construcao do objeto
}
private ListaPedido() {
... //construcao do objeto
}
sistema=xyz
versao=0.0.1
plataforma=MS Windows
sgbd=MySQL
autor=Jean Jorge Michel
configurações
serialização
pós-
processamento
public void gerarArquivo(String nome,
Map<String,Object> propriedades)
throws IOException{
String conteudo = "";
if (opcaoGeracao == TXT)
conteudo = gerarConteudoTXT(propriedades);
else if (opcaoGeracao == XML)
conteudo = gerarConteudoXML(propriedades);
byte [] bytes = conteudo.getBytes();
if (opcaoGeracao == TXT)
//transforma bytes em
bytes = criptografar(bytes);
else if (opcaoGeracao == XML)
bytes = compactar(bytes);
FileOutputStream fileout = new FileOutputStream(nome);
fileout.write(bytes);
fileout.close();
}
public void gerarArquivo(String nome,
Map<String,Object> propriedades)
throws IOException{
String conteudo = "";
if (opcaoGeracao == TXT)
conteudo = gerarConteudoTXT(propriedades);
else if (opcaoGeracao == XML)
conteudo = gerarConteudoXML(propriedades);
byte [] bytes = conteudo.getBytes();
if (opcaoGeracao == TXT)
//transforma bytes em
bytes = criptografar(bytes);
else if (opcaoGeracao == XML)
bytes = compactar(bytes);
FileOutputStream fileout = new FileOutputStream(nome);
fileout.write(bytes);
fileout.close();
}
public abstract class Serializador {
public abstract String
gerarConteudo(Map<String,Object> propriedades);
public abstract byte [] processar(byte[] bytes);
public void gerarArquivo(String nome,
Map<String, Object> propriedades)
throws IOException{
String conteudo = gerarConteudo(propriedades);
byte [] bytes = conteudo.getBytes();
bytes = processar(bytes);
FileOutputStream fileout = new FileOutputStream(nome);
fileout.write(bytes);
fileout.close();
}
}
public abstract class Serializador {
public abstract String
gerarConteudo(Map<String,Object> propriedades);
public abstract byte [] processar(byte[] bytes);
public void gerarArquivo(String nome,
Map<String, Object> propriedades)
throws IOException{
String conteudo = gerarConteudo(propriedades);
byte [] bytes = conteudo.getBytes();
bytes = processar(bytes);
FileOutputStream fileout = new FileOutputStream(nome);
fileout.write(bytes);
fileout.close();
}
}
public class SerializadorXMLCompactado
extends Serializador {
@Override
public String
gerarConteudo(Map<String, Object> propriedades){
//codigo para transformar propriedades
//em arquivo xml
}
@Override
public byte[] processar(byte[] bytes) {
//codigo para transformar xml em
//conteudo compactado
}
}
public void gerarArquivo(…) {
String conteudo = gerarConteudo(props);
byte[] bytes = conteudo.getBytes();
bytes = processar(bytes);
…
}
GeradorArquivo
gerarArquivo(…)
abstract gerarConteudo (…)
hook methods
processar (…)
GeradorXMLCompactado GeradorTXTCriptografado
metodoPrincipal()
metodoGancho()
Importância do uso da
herança:
Subclasse A Subclasse B
permitir especialização
de comportamento
metodoGancho() metodoGancho()
Passos diferentes na mesma ordem:
Template Method
Template
Template Method
if (server == oracle)
consulta = new ConsultaOracle();
else
<<interface>> consulta = new ConsultaSQL();
ConsultaBD consulta.executar(…);
executar(…)
executar(…) executar(…)
Factory Method
Solução
interface com modo de instanciar decidido em tempo de
execução
onde este código Java usa
o padrão Factory Method?
ArrayList al = new ArrayList();
// use iterator to display contents of al
System.out.print("Original contents of al: ");
Iterator itr = al.iterator();
while(itr.hasNext()) {
}
Problema
<<interface>> E se tivermos que criar
ConsultaBD
UpdateBD,
executar(…)
DeleteBD,
InsertBD?
ConsultaOracle ConsultaSQLServer
executar(…) executar(…)
Criando uma família de
objetos
class Motor {
public abstract boolean testar();
}
class MotorRenault extends Motor{
public boolean testar(){
//testa motor renault
}
}
class MotorToyota extends Motor{...}
class Chassi{
public abstract boolean testar();
}
class ChassiRenault extends Chassi{
public boolean testar(){
//testa chassi renault
}
}
class ChassiToyota extends Chassi{...}
Problema
ok = m.testar();
ok2 = c.testar();
78
Abstract Factory
Factory method!
Fábrica abstrata!
Exemplo da solução
//Montadora
Motor m;
FabricanteAutomoveis fa =
FabricanteAutomoveis.criarFabrica(“toyota”);
m = fa.criarMotor();
ok = m.testar();
79
Abstract Factory: solução
80
Abstract Factory
criação de famílias de objetos
Regras de instanciação guardadas nas fábricas concretas
Consequências
ConsultaOracle ConsultaSQLServer
executar(…) executar(…)
problema
public void colocarInfoCarrinho(HTTPServletRequest request){
Carrinho c = CookieFactory.criarCarrinho(request);
if (c !=null)
request.setAttribute("valor",c.getValor());
else
request.setAttribute("valor",0);
if (request.getAttribute("username")==null){
if (c !=null)
request.setAttribute("user",c.getNome());
else
request.setAttribute(“user",
"<a href=login.jsp>Login</a>");
}else{
request.setAttribute(“user",
request.getAttribute("username"));
}
public class CarrinhoNulo extends Carrinho {
}
Padrão Null Object
public class CarrinhoNulo extends Carrinho {
}
padrão Null Object
public void colocarInfoCarrinho(HTTPServletRequest request){
Carrinho c = CookieFactory.criarCarrinho(request);
request.setAttribute("valor",c.getValor());
if (request.getAttribute("username")==null){
request.setAttribute("user",c.getNome());
}else{
request.setAttribute("user",request.getAttribute("username"));
}
}
Consequências
pós-
processamento
Método de serialização
Método de pós-
processamento
Problema: E se quisermos gerar arquivos XML
criptografados e de propriedades compactados?
GeradorArquivo
gerarArquivo(…)
abstract gerarConteudo (…)
hook methods
processar (…)
GeradorXMLCompactado GeradorPropriedadesCriptografado
gerarArquivo(…)
abstract gerarConteudo (…)
processar (…)
GeradorCriptografado GeradorXMLCompactado
GeradorPropCriptog. GeradorXMLCriptog.
dup.
gerarConteudo (…) gerarConteudo (…) código
GeradorArquivo
gerarArquivo(…)
abstract gerarConteudo (…)
processar (…)
GeradorPropriedadesCriptografado GeradorXML
GeradorXMLCriptog. GeradorXMLCompact.
código
Bridge
Cria uma ponte entre duas hierarquias ligadas por uma relação de composição
permitindo que ambas variem de forma independente
<<interface>>
GeradorArquivo
Pós-processador
posProcessador
gerarArquivos
gerarConteudo (…) processar (…)
<<interface>>
GeradorArquivo
Pós-processador
posProcessador
gerarArquivos
gerarConteudo (…) processar (…)
ResultadoVotacao <<interface>>
RepresentacaoResultado
representacoes
addRepResultado(rep) atualizar(…)
atualizarVotos(votos)
notificar()
Grafico Tabela
for rep in representacoes
rep.atualizar(…)
atualizar(…) atualizar(…)
Observer: Solução
Composição de um com múltiplos objetos
É aplicável quando existe um objeto cujos eventos
precisam ser observados por outros objetos
Consequências
comportamento
- muda cor para cinza - adiciona nó
é alterado em
função do
estado (cor) do - visita nós adjacentes
objeto (nó) - muda cor para preto
State
Permite a mudança de estado de um objeto dinamicamente
Mais util ainda quando a mudança de estado provoca um comportamento
diferente
Subclasses de State representam comportamento variável
Consequências
116
Adapter
Adapter
Adapter
Adapter
Adapter
Solução
Utilizar uma classe ou mais classes que adaptam a classe alvo para
ser usada
Clientes da figura e a implementação de círculo ficam totalmente
independentes
A classe adaptadora permite separação que traz qualidade de
software
Consequências