exemplos de design patterns em java

40
Melhorando seu código com Design Patterns Alexandre Macedo K19 Treinamentos 18 de outubro de 2010 Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Upload: alexmacedo

Post on 29-Jun-2015

9.496 views

Category:

Technology


0 download

DESCRIPTION

Introdução à Design Patterns e detalhes e exemplos de 3 patterns: Observer, Adapter e Factory Method.

TRANSCRIPT

Page 1: Exemplos de Design Patterns em Java

Melhorando seu código com Design Patterns

Alexandre Macedo

K19 Treinamentos

18 de outubro de 2010

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 2: Exemplos de Design Patterns em Java

O que são Design Patterns?

I O termo ganhou popularidade depois do livro Design Patterns:Elements of Reusable Object-Oriented Software publicado em 1994,pelo conhecido GoF (Gang of Four);

I O livro apresenta uma série de problemas específicos para umdeterminado contexto, e apresenta uma solução. Essa solução acabaganhando um nome, e vira um Design Pattern;

I Ao todo, no livro são apresentados 23 patterns.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 3: Exemplos de Design Patterns em Java

O que são Design Patterns?

I O termo ganhou popularidade depois do livro Design Patterns:Elements of Reusable Object-Oriented Software publicado em 1994,pelo conhecido GoF (Gang of Four);

I O livro apresenta uma série de problemas específicos para umdeterminado contexto, e apresenta uma solução. Essa solução acabaganhando um nome, e vira um Design Pattern;

I Ao todo, no livro são apresentados 23 patterns.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 4: Exemplos de Design Patterns em Java

O que são Design Patterns?

I O termo ganhou popularidade depois do livro Design Patterns:Elements of Reusable Object-Oriented Software publicado em 1994,pelo conhecido GoF (Gang of Four);

I O livro apresenta uma série de problemas específicos para umdeterminado contexto, e apresenta uma solução. Essa solução acabaganhando um nome, e vira um Design Pattern;

I Ao todo, no livro são apresentados 23 patterns.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 5: Exemplos de Design Patterns em Java

O que são Design Patterns?

I O termo ganhou popularidade depois do livro Design Patterns:Elements of Reusable Object-Oriented Software publicado em 1994,pelo conhecido GoF (Gang of Four);

I O livro apresenta uma série de problemas específicos para umdeterminado contexto, e apresenta uma solução. Essa solução acabaganhando um nome, e vira um Design Pattern;

I Ao todo, no livro são apresentados 23 patterns.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 6: Exemplos de Design Patterns em Java

Design Patterns

I Factory MethodI Abstract FactoryI BuilderI PrototypeI SingletonI AdapterI BridgeI CompositeI DecoratorI FacadeI FlyweigthI Proxy

I Chain of ResponsabilityI CommandI InterpreterI IteratorI MediatorI MementoI ObserverI StateI StrategyI Template MethodI Visitor

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 7: Exemplos de Design Patterns em Java

Design Patterns

I Factory MethodI Abstract FactoryI BuilderI PrototypeI SingletonI AdapterI BridgeI CompositeI DecoratorI FacadeI FlyweigthI Proxy

I Chain of ResponsabilityI CommandI InterpreterI IteratorI MediatorI MementoI ObserverI StateI StrategyI Template MethodI Visitor

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 8: Exemplos de Design Patterns em Java

Orientação a Objetos

Boas práticas:

I identifique o que muda, e isole do código que permanece o mesmo;I programe para uma interface, não uma implementação;I priorize composição sobre herança.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 9: Exemplos de Design Patterns em Java

Orientação a Objetos

Boas práticas:

I identifique o que muda, e isole do código que permanece o mesmo;

I programe para uma interface, não uma implementação;I priorize composição sobre herança.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 10: Exemplos de Design Patterns em Java

Orientação a Objetos

Boas práticas:

I identifique o que muda, e isole do código que permanece o mesmo;I programe para uma interface, não uma implementação;

I priorize composição sobre herança.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 11: Exemplos de Design Patterns em Java

Orientação a Objetos

Boas práticas:

I identifique o que muda, e isole do código que permanece o mesmo;I programe para uma interface, não uma implementação;I priorize composição sobre herança.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 12: Exemplos de Design Patterns em Java

Orientação a Objetos

Bons princípios:

I DRY — Don’t repeat yourself!I KISS — Keep it simple, stupid!I YAGNI — You ain’t gonna need it!

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 13: Exemplos de Design Patterns em Java

Orientação a Objetos

Bons princípios:

I DRY — Don’t repeat yourself!

I KISS — Keep it simple, stupid!I YAGNI — You ain’t gonna need it!

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 14: Exemplos de Design Patterns em Java

Orientação a Objetos

Bons princípios:

I DRY — Don’t repeat yourself!I KISS — Keep it simple, stupid!

I YAGNI — You ain’t gonna need it!

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 15: Exemplos de Design Patterns em Java

Orientação a Objetos

Bons princípios:

I DRY — Don’t repeat yourself!I KISS — Keep it simple, stupid!I YAGNI — You ain’t gonna need it!

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 16: Exemplos de Design Patterns em Java

Factory MethodCaracterísticas

I define uma maneira padrão de criar objetos;

I bom para encapsular informações necessárias no momento dainstanciação do objeto.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 17: Exemplos de Design Patterns em Java

Factory MethodCaracterísticas

I define uma maneira padrão de criar objetos;I bom para encapsular informações necessárias no momento da

instanciação do objeto.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 18: Exemplos de Design Patterns em Java

Factory MethodAntes (sem a fábrica)

public static void main(String[] args) {String stringDeConexao = "jdbc:mysql://localhost:3306/database";

String usuario = "user";String senha = "password";

try {System.out.println("Abrindo conexao...");

Connection conexao = DriverManager.getConnection(stringDeConexao, usuario, senha);

String textoDoComando = "SELECT * FROM tabela;";

PreparedStatement comando = conexao.prepareStatement(textoDoComando);

System.out.println("Executando comando...");ResultSet resultado = comando.executeQuery();// continua o resto da classe

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 19: Exemplos de Design Patterns em Java

Factory MethodExemplo de Fábrica

public class FabricaDeConexao {public static Connection CriaConexao() {

String stringDeConexao = "jdbc:mysql://localhost:3306/database";String usuario = "user";String senha = "password";

Connection conexao = null;

try {conexao = DriverManager.getConnection(stringDeConexao, usuario,

senha);} catch (SQLException e) {e.printStackTrace();

}return conexao;

}}

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 20: Exemplos de Design Patterns em Java

Factory MethodDepois (já utilizando a fábrica)

public static void main(String[] args) {

try {System.out.println("Abrindo conexao...");Connection conexao = FabricaDeConexao.CriaConexao();

String textoDoComando = "SELECT * FROM tabela;";

PreparedStatement comando = conexao.prepareStatement(textoDoComando);

System.out.println("Executando comando...");ResultSet resultado = comando.executeQuery();

// continua o resto da classe

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 21: Exemplos de Design Patterns em Java

Factory MethodMais avançado

Quando há mais de um tipo de classe a ser criado, o padrão Factory Methodé usualmente usado para definir uma interface para criar um objeto,deixando para subclasses decidirem qual objeto deve ser instanciado.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 22: Exemplos de Design Patterns em Java

Factory MethodMais avançado

Quando há mais de um tipo de classe a ser criado, o padrão Factory Methodé usualmente usado para definir uma interface para criar um objeto,deixando para subclasses decidirem qual objeto deve ser instanciado.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 23: Exemplos de Design Patterns em Java

AdapterCaracterísticas

I o objetivo do padrão Adapter é converter a interface de uma classepara uma outra interface que o sistema espera;

I é utilizado quando mudanças diretas feitas na interface das classes nãopodem (ou não devem) ser feitas, então o Adapter é necessário paraque as duas classes possam interagir entre si;

I também conhecido como Wrapper.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 24: Exemplos de Design Patterns em Java

AdapterCaracterísticas

I o objetivo do padrão Adapter é converter a interface de uma classepara uma outra interface que o sistema espera;

I é utilizado quando mudanças diretas feitas na interface das classes nãopodem (ou não devem) ser feitas, então o Adapter é necessário paraque as duas classes possam interagir entre si;

I também conhecido como Wrapper.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 25: Exemplos de Design Patterns em Java

AdapterCaracterísticas

I o objetivo do padrão Adapter é converter a interface de uma classepara uma outra interface que o sistema espera;

I é utilizado quando mudanças diretas feitas na interface das classes nãopodem (ou não devem) ser feitas, então o Adapter é necessário paraque as duas classes possam interagir entre si;

I também conhecido como Wrapper.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 26: Exemplos de Design Patterns em Java

AdapterDiagrama

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 27: Exemplos de Design Patterns em Java

AdapterExemplo

I se você já encontrou algum código antigo de Java é bem possível quetenha encontrado a interface Enumeration;

I hoje em dia, até de acordo com a API da Orcle, é indicado utilizar ainterface Iterator;

I digamos que você tenha que utilizar uma API legada de um sistemamais antigo, que utiliza Enumeration e precisa integrar com um sistemamais recente que apenas utiliza Iterator;

I isso parece um trabalho para o Adapter.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 28: Exemplos de Design Patterns em Java

AdapterExemplo

I se você já encontrou algum código antigo de Java é bem possível quetenha encontrado a interface Enumeration;

I hoje em dia, até de acordo com a API da Orcle, é indicado utilizar ainterface Iterator;

I digamos que você tenha que utilizar uma API legada de um sistemamais antigo, que utiliza Enumeration e precisa integrar com um sistemamais recente que apenas utiliza Iterator;

I isso parece um trabalho para o Adapter.

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 29: Exemplos de Design Patterns em Java

AdapterExemplo

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 30: Exemplos de Design Patterns em Java

AdapterExemplo

public class EnumerationIterator implements Iterator {

private Enumeration colecao;

public EnumerationIterator(Enumeration colecao) {this.colecao = colecao;

}

public boolean hasNext() {return this.colecao.hasMoreElements();

}

public Object next() {return this.colecao.nextElement();

}

public void remove() {throw new UnsupportedOperationException();

}}

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 31: Exemplos de Design Patterns em Java

ObserverCaracterísticas

I define uma relação de um-para-muitos entre objetos, de forma que,quando um objeto tem seu estado alterado, todos os seus dependentessão notificados e atualizados automaticamente;

I também conhecido como Publish/Subscribe;I muito utilizado em interfaces para Desktop;

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 32: Exemplos de Design Patterns em Java

ObserverCaracterísticas

I define uma relação de um-para-muitos entre objetos, de forma que,quando um objeto tem seu estado alterado, todos os seus dependentessão notificados e atualizados automaticamente;

I também conhecido como Publish/Subscribe;

I muito utilizado em interfaces para Desktop;

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 33: Exemplos de Design Patterns em Java

ObserverCaracterísticas

I define uma relação de um-para-muitos entre objetos, de forma que,quando um objeto tem seu estado alterado, todos os seus dependentessão notificados e atualizados automaticamente;

I também conhecido como Publish/Subscribe;I muito utilizado em interfaces para Desktop;

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 34: Exemplos de Design Patterns em Java

ObserverCaracterísticas

I define uma relação de um-para-muitos entre objetos, de forma que,quando um objeto tem seu estado alterado, todos os seus dependentessão notificados e atualizados automaticamente;

I também conhecido como Publish/Subscribe;I muito utilizado em interfaces para Desktop;

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 35: Exemplos de Design Patterns em Java

ObserverExemplo

public interface Observable {

void register(Observer observer);

void unregister(Observer observer);

void notifyObservers();}

public interface Observer {void update(int i);

}

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 36: Exemplos de Design Patterns em Java

ObserverExemplo

public class Aquecedor implements Observer {

private Observable sensor;private boolean ligado;

public Aquecedor(Observable sensor) {this.sensor = sensor;this.sensor.register(this);this.ligado = false;

}

public void update(int i) {if (i <= 16 && !ligado) {System.out.println("Temperatura: " + i+ " -> Ligando o aquecedor...");this.ligado = true;

} else if (i > 16 && ligado) {System.out.println("Temperatura: " + i+ " -> Desligando o aquecedor...");this.ligado = false;

}}

}Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 37: Exemplos de Design Patterns em Java

ObserverExemplo

public class ArCondicionado implements Observer {

private boolean ligado;private Observable sensor;

public ArCondicionado(Observable sensor) {this.sensor = sensor;this.sensor.register(this);this.ligado = false;

}

public void update(int i) {if (i > 24 && !ligado) {System.out.println("Temperatura: " + i+ " -> Ligando o ar condicionado...");this.ligado = true;

} else if (i <= 16 && ligado) {System.out.println("Temperatura: " + i+ " -> Desligando o ar condicionado...");this.ligado = false;

}}

}Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 38: Exemplos de Design Patterns em Java

ObserverExemplo

public class SensorDeTemperatura implements Observable {private int temperatura;List<Observer> observers = new ArrayList<Observer>();;public void setTemperatura(int temperatura) {

if (this.temperatura != temperatura) {this.temperatura = temperatura;notifyObservers();}

}public void register(Observer observer) {

this.observers.add(observer);}public void unregister(Observer observer) {

this.observers.remove(observer);}public void notifyObservers() {

for (Observer o : this.observers) {o.update(this.temperatura);}

}}

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 39: Exemplos de Design Patterns em Java

ObserverExemplo

public class Principal {public static void main(String[] args) {

SensorDeTemperatura sensor = new SensorDeTemperatura();Observer ar = new ArCondicionado(sensor);Observer aquecedor = new Aquecedor(sensor);

sensor.setTemperatura(22);sensor.setTemperatura(29);sensor.setTemperatura(15);sensor.setTemperatura(22);

}}

Temperatura: 29 -> Ligando o ar condicionado...Temperatura: 15 -> Desligando o ar condicionado...Temperatura: 15 -> Ligando o aquecedor...Temperatura: 22 -> Desligando o aquecedor...

Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br

Page 40: Exemplos de Design Patterns em Java

Obrigado!

Dúvidas ou sugestões: [email protected] acompanhar as novidades confira o site: www.k19.com.br

Ou siga-nos no Twitter: @k19treinamentos