DESIGN PATTERNS, REFACTORING,
EXTREME PROGRAMMING E FRAMEWORKS

DESIGN PATTERNS

"CADA PADRÃO DESCREVE UM PROBLEMA QUE OCORRE FREQUENTEMENTE E ENTÃO DESCREVE O CERNE DA SOLUÇÃO AO PROBLEMA DE FORMA A PODER USAR A SOLUÇÃO MILHÕES DE VEZES EM SITUAÇÕES SEMELHANTES"

ELEMENTOS ESSENCIAIS DE UM PADRÃO:

INTRODUÇÃO A PADRÕES ATRAVÉS DE UM EXEMPLO

UM PADRÃO DE CRIAÇÃO PARA CONSTRUIR LABIRINTOS


abstract class ElementoDeLabirinto {
    public abstract void entra();
}

class Sala extends ElementoDeLabirinto {
    private ElementoDeVizinho[] vizinhos = new ElementoDeVizinho[4];
    private int númeroDaSala;

    public void Sala(int númeroDaSala) {
        ...
    }
    public void entra() {
        ...
    }
    public ElementoDeLabirinto getVizinho(int direção) {
        ...
    }
    public void setVizinho(int direção, ElementoDeLabirinto vizinho) {
        ...
    }
}

class Parede extends ElementoDeLabirinto {
    public void Parede() {
        ...
    }
    public void entra() {
        ...
    }
}

class Porta extends ElementoDeLabirinto {
    private Sala sala1, sala2;
    private boolean estáAberta;

    public void Porta(ElementoDeLabirinto sala1, ElementoDeLabirinto sala2) {
        ...
    }
    public void entra() {
        ...
    }
    public Sala salaDoOutroLado(Sala sala) {
        ...
    }
}

class Labirinto {
    private Vector salas = new Vector();

    public void Labirinto() {
        ...
    }
    public void adicionaSala(Sala sala) {
        ...
    }
    public Sala getSala(int númeroDaSala) {
        ...
    }
}

class Jogo {
    ...
    public Labirinto criaLabirinto() {
        Labirinto umLabirinto = new Labirinto();
        Sala sala1 = new Sala(1);
        Sala sala2 = new Sala(2);
        Porta aPorta = new Porta(sala1, sala2);

        umLabirinto.adicionaSala(sala1);
        umLabirinto.adicionaSala(sala2);

        sala1.setVizinho(NORTE, new Parede());
        sala1.setVizinho(LESTE, aPorta);
        sala1.setVizinho(SUL, new Parede());
        sala1.setVizinho(OESTE, new Parede());

        sala2.setVizinho(NORTE, new Parede());
        sala2.setVizinho(LESTE, new Parede());
        sala2.setVizinho(SUL, new Parede());
        sala2.setVizinho(OESTE, aPorta);

        return umLabirinto;
    }
    ...
}

UM EXEMPLO DE DESIGN PATTERN

FACTORY METHOD

EXEMPLO DE CÓDIGO: CRIAÇÃO DE LABIRINTOS


classe Jogo {
    // factory methods com default
    public Labirinto criaLabirinto() {
        return new Labirinto();
    }
    public Sala criaSala(int númeroDaSala) {
        return new Sala(númeroDaSala);
    }
    public Parede criaParede() {
        return new Parede();
    }
    public Porta criaPorta(Sala sala1, Sala sala2) {
        return new Porta(sala1, sala2);
    }

    // Observe que essa função não tem new: ela usa factory methods
    // Esta é a *única* diferença com relação à versão original
    public Labirinto criaLabirinto() {
        Labirinto umLabirinto = criaLabirinto();
        Sala sala1 = criaSala(1);
        Sala sala2 = criaSala(2);
        Porta aPorta = criaPorta(sala1, sala2);

        umLabirinto.adicionaSala(sala1);
        umLabirinto.adicionaSala(sala2);

        sala1.setVizinho(NORTE, criaParede());
        sala1.setVizinho(LESTE, aPorta);
        sala1.setVizinho(SUL, criaParede());
        sala1.setVizinho(OESTE, criaParede());

        sala2.setVizinho(NORTE, criaParede());
        sala2.setVizinho(LESTE, criaParede());
        sala2.setVizinho(SUL, criaParede());
        sala2.setVizinho(OESTE, aPorta);

        return umLabirinto;
    }
}

// Um novo CriadorConcreto
class JogoPerigoso extends Jogo {
    public Parede criaParede() {
        return new ParedeDestruível();
    }
    public Sala criaSala(int númeroDaSala) {
        return new SalaComBomba(númeroDaSala);
    }
}


// Um novo CriadorConcreto
class JogoEncantado extends Jogo {
    public Sala criaSala(int númeroDaSala) {
        return new SalaEncantada(númeroDaSala, jogaEncantamento());
    }
    public Porta criaPorta(Sala sala1, Sala sala2) {
        return new PortaPrecisandoDeEncantamento(sala1, sala2);
    }
    protected Encantamento jogaEncantamento() {
        ...
    }
}

etc1.htm programa próxima