Exemplos de Design Patterns em Java

12,213 views

Published on

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

2 Comments
2 Likes
Statistics
Notes
No Downloads
Views
Total views
12,213
On SlideShare
0
From Embeds
0
Number of Embeds
534
Actions
Shares
0
Downloads
348
Comments
2
Likes
2
Embeds 0
No embeds

No notes for slide

Exemplos de Design Patterns em Java

  1. 1. 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
  2. 2. O que são Design Patterns? Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  3. 3. 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); Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  4. 4. 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 um determinado contexto, e apresenta uma solução. Essa solução acaba ganhando um nome, e vira um Design Pattern; Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  5. 5. 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 um determinado contexto, e apresenta uma solução. Essa solução acaba ganhando 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
  6. 6. Design Patterns I Factory Method I Abstract Factory I Builder I Prototype I Singleton I Adapter I Bridge I Composite I Decorator I Facade I Flyweigth I Proxy I Chain of Responsability I Command I Interpreter I Iterator I Mediator I Memento I Observer I State I Strategy I Template Method I Visitor Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  7. 7. Design Patterns I Factory Method I Abstract Factory I Builder I Prototype I Singleton I Adapter I Bridge I Composite I Decorator I Facade I Flyweigth I Proxy I Chain of Responsability I Command I Interpreter I Iterator I Mediator I Memento I Observer I State I Strategy I Template Method I Visitor Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  8. 8. Orientação a Objetos Boas práticas: Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  9. 9. Orientação a Objetos Boas práticas: I identifique o que muda, e isole do código que permanece o mesmo; Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  10. 10. 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; Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  11. 11. 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
  12. 12. Orientação a Objetos Bons princípios: Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  13. 13. Orientação a Objetos Bons princípios: I DRY — Don’t repeat yourself! Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  14. 14. Orientação a Objetos Bons princípios: I DRY — Don’t repeat yourself! I KISS — Keep it simple, stupid! Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  15. 15. 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
  16. 16. Factory Method Características I define uma maneira padrão de criar objetos; Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  17. 17. Factory Method Caracterí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
  18. 18. Factory Method Antes (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
  19. 19. Factory Method Exemplo 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
  20. 20. Factory Method Depois (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
  21. 21. Factory Method Mais 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
  22. 22. Factory Method Mais 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
  23. 23. Adapter Características I o objetivo do padrão Adapter é converter a interface de uma classe para uma outra interface que o sistema espera; Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  24. 24. Adapter Características I o objetivo do padrão Adapter é converter a interface de uma classe para uma outra interface que o sistema espera; I é utilizado quando mudanças diretas feitas na interface das classes não podem (ou não devem) ser feitas, então o Adapter é necessário para que as duas classes possam interagir entre si; Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  25. 25. Adapter Características I o objetivo do padrão Adapter é converter a interface de uma classe para uma outra interface que o sistema espera; I é utilizado quando mudanças diretas feitas na interface das classes não podem (ou não devem) ser feitas, então o Adapter é necessário para que 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
  26. 26. Adapter Diagrama Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  27. 27. Adapter Exemplo I se você já encontrou algum código antigo de Java é bem possível que tenha encontrado a interface Enumeration; I hoje em dia, até de acordo com a API da Orcle, é indicado utilizar a interface Iterator; I digamos que você tenha que utilizar uma API legada de um sistema mais antigo, que utiliza Enumeration e precisa integrar com um sistema mais recente que apenas utiliza Iterator; Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  28. 28. Adapter Exemplo I se você já encontrou algum código antigo de Java é bem possível que tenha encontrado a interface Enumeration; I hoje em dia, até de acordo com a API da Orcle, é indicado utilizar a interface Iterator; I digamos que você tenha que utilizar uma API legada de um sistema mais antigo, que utiliza Enumeration e precisa integrar com um sistema mais 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
  29. 29. Adapter Exemplo Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  30. 30. Adapter Exemplo 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
  31. 31. Observer Caracterí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 dependentes são notificados e atualizados automaticamente; Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  32. 32. Observer Caracterí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 dependentes são notificados e atualizados automaticamente; I também conhecido como Publish/Subscribe; Alexandre Macedo Melhorando seu código com Design Patterns www.k19.com.br
  33. 33. Observer Caracterí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 dependentes sã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
  34. 34. Observer Caracterí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 dependentes sã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
  35. 35. Observer Exemplo 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
  36. 36. Observer Exemplo 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
  37. 37. Observer Exemplo 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
  38. 38. Observer Exemplo 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
  39. 39. Observer Exemplo 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
  40. 40. Obrigado! Dúvidas ou sugestões: contato@k19.com.br Para acompanhar as novidades confira o site: www.k19.com.br Ou siga-nos no Twitter: @k19treinamentos

×