Вы находитесь на странице: 1из 18

Design Patterns - Rubirinha 1] State

Parecido com o Strategy, este Pattern visa evitar o uso de condicionais utilizando classes implementadas pela interface (ou classe abstrata) State. Nota-se que, Handle() do ConcreteStateN pode mudar a condio. Exemplo : Porta Automtica

Porta: classe Door Esta classe representa a porta nas condies descritas acima. Note-se a definio das respostas aos estmulos em funo do estado. class Door { public final DoorState CLOSED = new DoorClosed(this); public final DoorState OPENING = new DoorOpening(this); public final DoorState OPEN = new DoorOpen(this); public final DoorState CLOSING = new DoorClosing(this); public final DoorState STAYOPEN = new DoorStayOpen(this); private DoorState _state = CLOSED; protected void setState(DoorState state) { _state = state; }

public void click() { _state.click(); } public void complete() { _state.complete(); } public void timeout() { _state.timeout(); } public void status() { System.out.println(_state.status()); } } O estado da porta: classe DoorState Esta classe representa a abstraco do estado da porta. Os estados concretos vo aumentar a funcionalidade desta classe, de acordo com o comportamento desejado. abstract class DoorState { protected Door _door; public DoorState(Door door) { _door = door; } public abstract void click(); public void timeout() { } public void complete() { } public String status() { return getClass().getName(); } }

Os vrios estados da porta: classes concretas Cada uma das classes implementa o estado correspondente a uma dada situao da porta. nestas classes que a resposta aos estmulos realmente definida. class DoorOpen extends DoorState { public DoorOpen(Door door) { super(door); } public void click() { _door.setState(_door.STAYOPEN); } public void timeout() { _door.setState(_door.CLOSING); } } class DoorOpening extends DoorState { public DoorOpening(Door door) { super(door); } public void click() { _door.setState(_door.CLOSING); } public void complete() { _door.setState(_door.OPEN); } } class DoorClosed extends DoorState { public DoorClosed(Door door) { super(door); } public void click() { _door.setState(_door.OPENING); } } class DoorClosing extends DoorState { public DoorClosing(Door door) { super(door); } public void click() { _porta.setState(_door.OPENING); }

public void complete() { _porta.setState(_door.CLOSED); } } class DoorStayOpen extends DoorState { public DoorStayOpen(Door door) { super(door); } public void click() { _door.setState(_door.CLOSING); } }

2] Faade

Faade simplifica a chamada de tarefa (ou tarefas) ajudando o cliente a acess-lo com uma interface simplificada. Uma faade pode conter um conjunto de aes que frequentemente so utilizadas juntas, como no exemplo a seguir. Notamos que a principal diferena entre este Pattern e o Adapter, est no fato deste pretender fornecer uma interface simplificada enquanto o adaptador preve a daptao de determinadas interfaces. Note que ambos podem mudar/instanciar mais de uma classe. Exemplo : Computador

/* Complex parts */ class CPU { public void freeze() { ... } public void jump(long position) { ... } public void execute() { ... } }

class Memory { public void load(long position, byte[] data) { ... } } class HardDrive { public byte[] read(long lba, int size) { ... } } /* Facade */ 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(); } } /* Client */ class You { public static void main(String[] args) { Computer facade = new Computer(); facade.startComputer(); } } 3] Factory Method

Resolve, utilizando dados passados como parmetro ou outros dados do programa, qual a classe

deve ser instanciada e retorna o objeto. Este, geralmente segue uma interface (ou classe abstrata, que no desenho a classe Carro), que determina diversas mtodos em comum para as subclasses, fazendo com que o uso dos vrios tipos de carros possa ser feito sem o conhecimento de todas as classes. Pode ser feito o uso de uma interface, na Factory, que define a funo de criao da Carro Factory, entretanto algumas (e acredito que a da Rubira) possuem apenas uma factory, com mtodos do tipo static (ou seja, geralmente, as fbricas nem so instanciadas). Segue Exemplo: public abstract class Carro { protected float valor; public float getPreco() { return valor; } } public class Vectra extends Carro { public Vectra() { valor = 30000.0f; } }

public class Omega extends Carro { public Omega() { valor = 50000.0f; } } public class Golf extends Carro { public Golf() { valor = 35000.0f; } } public class Gol extends Carro { public Gol() { valor = 20000.0f; } } public class CarroFactory { public static Carro getCarro( String tipoCarro ) { if( tipoCarro == null ) return null; else if( tipoCarro.equals("Vectra") ) return new Vectra(); else if( tipoCarro.equals("Omega") ) return new Omega(); else if( tipoCarro.equals("Golf") ) return new Golf(); else if( tipoCarro.equals("Gol") ) return new Gol(); else return null;

} } public class FactoryExample { public static void main( String args[] ) { //parmetro passado como argumento no console //pega a instncia do tipo do carro Carro carro = CarroFactory.getCarro( args[0] ); //mostra o valor if( carro != null ) { System.out.println( "Preo: " + carro.getPreco() ); } } }

4] Abstract Factory

Trata-se de uma fbrica multi-funo, que cria mais de uma coisa e, possivelmente, em mais de um modelo. No caso da segunda foto, trata-se de botes e janelas diferentes. O WidgetFactory, utilizando algum critrio pr-definido, resolve em conjunto das outras factorys quais vo ser a classe dos objetos instanciados para cada Janela ou Boto pedidos. Percebe-se que no exemplo de cdigo, usado apenas o Boto (provavelmente por preguia de quem fez o exemplo). Exemplo: Boto abstract class WidgetFactory { public static WidgetFactory obterFactory() { if( Configuracao.obterInterfaceGraficaAtual() == Configuracao.MotifWidget ) { return new MotifWidgetFactory(); } else { return new QtWidgetFactory(); } } public abstract Botao criarBotao();

} class MotifWidgetFactory extends WidgetFactory { public Botao criarBotao() { return new BotaoMotif(); } } class QtWidgetFactory extends WidgetFactory { public Botao criarBotao() { return new BotaoQt(); } } abstract class Botao { public abstract void desenhar(); } class BotaoMotif extends Botao { public void desenhar() { System.out.println("Eu sou um botao Motif!"); } } class BotaoQt extends Botao

{ public void desenhar() { System.out.println("Eu sou um botao Qt!"); } } public class Cliente { public static void main(String[] args) { WidgetFactory factory = WidgetFactory.obterFactory(); Botao botao = factory.criarBotao(); botao.desenhar(); } } 5] Singleton Cade o desenho? , este mais simples, nem desenho tem. Trata-se de garantir que haver apenas uma instncia de determinada classe. Para garantir que isto realmente ocorra, mudamos o construtor da classe para privado, adicionamos um objeto desta classe como varivel static e fazemos uma funo de acesso que instancia, se necessrio (primeiro acesso), e devolve este objeto.

Exemplo: Uma classe qualquer public class MySingleton { // Instancia privada que ser acessada private static MySingleton myInstance; // Construtor privado. Suprime o construtor pblico padrao. private MySingleton() { // Operaes de inicializao da classe } // Mtodo pblico de acesso nico ao objeto! public synchronized static MySingleton getInstance(){ if(myInstance == null) { myInstance = new MySingleton(); } return myInstance; } }

6] Adapter

O adapter tem como objetivo reutilizar cdigo, criando uma interface para a relao entre duas classes que antes no era possvel. Acontece uma correo/adaptao do que necessrio e chamado, atravs de duas possibilidades: Adapter de Objeto : acontece uma instanciao do apdaptado dentro do adapter que cuidar por chamar as funes corretas no momento corrto. Adapter de Classe: h a criao de uma subclasse adapter que cuidar de arrumar o que for

necessrio. Note, que neste caso, pode ser necessrio o uso de herana mltipla, o que no existe em java.

Вам также может понравиться