<file_sep>package br.com.gbd.apostiladesignpatterns.estrutural.bridge;

/*
    Autor: <NAME>
    Data: 08/08/2016, 15:52:58
    Arquivo: Documento
*/

public interface Documento {

    void geraArquivo();
}
<file_sep>package br.com.gbd.apostiladesignpatterns.estrutural.flyweight;

import java.util.HashMap;
import java.util.Map;

/*
    Autor: <NAME>
    Data: 09/08/2016, 09:03:40
    Arquivo: TemaFlyweightFactory
*/

public class TemaFlyweightFactory {
    private static Map<Class<? extends TemaFlyweight>, TemaFlyweight> temas = new HashMap<>();
    public static final Class<TemaAsterisco> ASTERISCCO = TemaAsterisco.class;
    public static final Class<TemaHifen> HIFEN = TemaHifen.class;
    public static final Class<TemaGBD> GBD = TemaGBD.class;
    
    public static TemaFlyweight getTema(Class<? extends TemaFlyweight> clazz){
        if(!temas.containsKey(clazz)){
            try{
                temas.put(clazz, clazz.newInstance());
            } catch(Exception e){
                e.printStackTrace();
            }
        }
        
        return temas.get(clazz);
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.comportamental.visitor;

import java.util.ArrayList;
import java.util.List;

/*
    Autor: <NAME>
    Data: 09/08/2016, 15:47:21
    Arquivo: Departamento
*/

public class Departamento {

    private String nome;
    private List<Funcionario> funcionarios = new ArrayList<>();

    public Departamento(String nome) {
        this.nome = nome;
    }

    public String getNome(){
        return this.nome;
    }
    
    public List<Funcionario> getFuncionarios(){
        return funcionarios;
    }
    
    public void aceita(AtualizadorDeFuncionario atual){
        for(Funcionario f : this.funcionarios){
            f.aceita(atual);
        }
    }
}
<file_sep>package br.com.gbd.designpatterns.abstractFactory;

import br.com.gbd.apostiladesignpatterns.abstractFactory.Emissor;

/*
    Autor: <NAME>
    Data: 08/08/2016, 09:48:16
    Arquivo: EmissorVisa
*/

public class EmissorVisa implements Emissor{

    @Override
    public void envia(String mensagem) {
        System.out.println("Enviando a seguinte msg para a Visa: ");
        System.out.println(mensagem);
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns;

import br.com.gbd.apostiladesignpatterns.comportamental.visitor.AtualizadorDeFuncionario;
import br.com.gbd.apostiladesignpatterns.comportamental.visitor.AtualizadorSalarial;
import br.com.gbd.apostiladesignpatterns.comportamental.visitor.Departamento;
import br.com.gbd.apostiladesignpatterns.comportamental.visitor.Funcionario;
import br.com.gbd.apostiladesignpatterns.comportamental.visitor.Gerente;
import br.com.gbd.apostiladesignpatterns.comportamental.visitor.Telefonista;
import java.util.ArrayList;
import java.util.List;

/*
    Autor: <NAME>
    Data: 09/08/2016, 16:03:17
    Arquivo: Visitor
*/

public class Visitor {

    public static void testaVisitor(){
        List<Departamento> lista = new ArrayList<>();
        Departamento departamento = new Departamento("Departamento1");
        Gerente gerente = new Gerente("1234", "Gerente1", 2000);
        Telefonista telefonista = new Telefonista(2, "Telefonista1", 1000);
        departamento.getFuncionarios().add(gerente);
        departamento.getFuncionarios().add(telefonista);
        
        lista.add(departamento);
        
        departamento = new Departamento("Departamento2");
        gerente = new Gerente("1234", "Gerente2", 2000);
        telefonista = new Telefonista(3, "Telefonista2", 1000);
        departamento.getFuncionarios().add(gerente);
        departamento.getFuncionarios().add(telefonista);
        gerente = new Gerente("1234", "Gerente3", 2000);
        departamento.getFuncionarios().add(gerente);
        
        lista.add(departamento);
        
        AtualizadorDeFuncionario atual = new AtualizadorSalarial();
        
        for(Departamento d : lista){
            d.aceita(atual);
        }
        
        for(Departamento d : lista){
            for(Funcionario f : d.getFuncionarios()){
                System.out.println("Nome: " + f.getNome() + " - Salário: " + f.getSalario());
            }
        }
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns;

import br.com.gbd.apostiladesignpatterns.criacao.builder.BBBoletoBuilder;
import br.com.gbd.apostiladesignpatterns.criacao.builder.Boleto;
import br.com.gbd.apostiladesignpatterns.criacao.builder.BoletoBuilder;
import br.com.gbd.apostiladesignpatterns.criacao.builder.GeradorDeBoleto;

/*
    Autor: <NAME>
    Data: 08/08/2016, 11:33:03
    Arquivo: Bulder
*/

public class Builder {

    public static void testaGeradorDeBoletos(){
        BoletoBuilder boletoBuilder = new BBBoletoBuilder();
        GeradorDeBoleto geradorDeBoleto = new GeradorDeBoleto(boletoBuilder);
        Boleto boleto = geradorDeBoleto.geraBoleto();
        
        System.out.println(boleto);
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.comportamental.state;

/*
    Autor: <NAME>
    Data: 09/08/2016, 15:00:57
    Arquivo: Bandeira1
*/

public class Bandeira1 implements Bandeira{

    @Override
    public double calcularValorDaCorrida(double tempo, double distancia) {
        return 5.0 + tempo * 1.5 + distancia * 1.7;
    }

}
<file_sep>package br.com.gbd.apostiladesignpatterns.estrutural.bridge;

/*
    Autor: <NAME>
    Data: 08/08/2016, 16:01:07
    Arquivo: GeradorDeArquivo
 */
public interface GeradorDeArquivo {

    public void gera(String conteudo);
}
<file_sep>package br.com.gbd.apostiladesignpatterns.estrutural.adapter;

import java.text.SimpleDateFormat;
import java.util.Calendar;

/*
    Autor: <NAME>
    Data: 08/08/2016, 15:39:37
    Arquivo: ControleDePontoNovo
 */
public class ControleDePontoNovo {

    public void registra(Funcionario f, boolean entrada) {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy H:m:s");
        String format = sdf.format(calendar.getTime());

        if (entrada) {
            System.out.println("Entrada: " + f.getNome() + " às " + format);
        } else {
            System.out.println("Saída: " + f.getNome() + " às " + format);
        }
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.criacao.abstractFactory;

/*
    Autor: <NAME>
    Data: 08/08/2016, 11:48:50
    Arquivo: ReceptorCreator
*/

public class ReceptorCreator {

    public static final int VISA = 0;
    public static final int MASTERCARD = 1;
    
    public Receptor create(int tipoDoReceptor){
        if(tipoDoReceptor == EmissorCreator.VISA){
            return new ReceptorVisa();
        } else if (tipoDoReceptor == EmissorCreator.MASTERCARD){
            return new ReceptorMatercard();
        } else {
            throw new IllegalArgumentException("Tipo de emissor não suportado"); 
        }
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.comportamental.command;

/*
    Autor: <NAME>
    Data: 09/08/2016, 12:30:19
    Arquivo: Comando
 */
public interface Comando {

    void executa();
}
<file_sep>package br.com.gbd.apostiladesignpatterns.criacao.abstractFactory;

/*
    Autor: <NAME>
    Data: 08/08/2016, 09:35:22
    Arquivo: comunicadorFactory
*/

public interface ComunicadorFactory {
    Emissor createEmissor();
    Receptor createReceptor();
}
<file_sep>package br.com.gbd.apostiladesignpatterns.comportamental.command;

import java.util.ArrayList;
import java.util.List;

/*
    Autor: <NAME>
    Data: 09/08/2016, 13:19:06
    Arquivo: ListaDeComandos
*/

public class ListaDeComandos {

    private List<Comando> comandos = new ArrayList<>();
    
    public void adiciona(Comando comando){
        this.comandos.add(comando);
    }
    
    public void executa(){
        for(Comando comando : this.comandos){
            comando.executa();
        }
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.criacao.abstractFactory;

import br.com.gbd.apostiladesignpatterns.criacao.abstractFactory.Emissor;

/*
    Autor: <NAME>
    Data: 08/08/2016, 09:49:19
    Arquivo: EmissorMastercard
*/

public class EmissorMastercard implements Emissor{

    @Override
    public void envia(String mensagem) {
        System.out.println("Enviando a seguinte msg para a Mastercard: ");
        System.out.println(mensagem);
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns;

import br.com.gbd.apostiladesignpatterns.comportamental.iterator.ListaDeNomes;

/*
    Autor: <NAME>
    Data: 09/08/2016, 13:42:48
    Arquivo: Iterator
*/

public class Iterator {

    public static void testaIterator(){
        String[] nomes = new String[4];
        nomes[0] = "José";
        nomes[1] = "Carlos";
        nomes[2] = "Freitas";
        nomes[3] = "Henrique";
        
        ListaDeNomes listaDeNomes = new ListaDeNomes(nomes);
        
        //BUGADO
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.comportamental.command;

/*
    Autor: <NAME>
    Data: 09/08/2016, 12:26:38
    Arquivo: Player
*/

public class Player {

    public void play(String filename) throws InterruptedException {
        System.out.println("Tocando arquivo: " + filename);
        long duracao = (long)(Math.random()*2000);
        System.out.println("Duração (s): " + duracao/1000.0);
        Thread.sleep(duracao);
        System.out.println("FIM");
    }
    
    public void increaseVol(int levels){
        System.out.println("Aumentando o volume em: " + levels);
    }
    
    public void decreaseVol(int levels){
        System.out.println("Diminuindo o volume em: " + levels);
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.estrutural.decorator;

/*
    Autor: <NAME>
    Data: 08/08/2016, 16:58:58
    Arquivo: Emissor
 */
public interface Emissor {

    void envia(String msg);
}
<file_sep>package br.com.gbd.apostiladesignpatterns.criacao.objectPool;

import java.util.ArrayList;
import java.util.List;

/*
    Autor: <NAME>
    Data: 08/08/2016, 15:13:21
    Arquivo: FuncionarioPool
*/

public class FuncionarioPool implements Pool<Funcionario>{
    
    private List<Funcionario> funcionarios;

    public FuncionarioPool() {
        this.funcionarios = new ArrayList<>();
        this.funcionarios.add(new Funcionario("<NAME>"));
        this.funcionarios.add(new Funcionario("Tadeu"));
        this.funcionarios.add(new Funcionario("Henrique"));
    }

    @Override
    public Funcionario acquire() {
        if(this.funcionarios.size()>0){
            return this.funcionarios.remove(0);
        } else {
            return null;
        }
    }

    @Override
    public void release(Funcionario funcionario) {
        this.funcionarios.add(funcionario);
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.estrutural.facade;

import java.text.SimpleDateFormat;
import java.util.Calendar;

/*
    Autor: <NAME>
    Data: 09/08/2016, 08:46:20
    Arquivo: PosVenda
*/

public class PosVenda {

    public void agendaContato(String cliente, String produto){
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE, 30);
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        String format = sdf.format(calendar.getTime());
        
        System.out.println("Entrar em contato com " + cliente + " sobre o produto " + produto + " no dia " + format);
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.comportamental.observer;

/*
    Autor: <NAME>
    Data: 09/08/2016, 14:43:45
    Arquivo: Corretora
*/

public class Corretora implements AcaoObserver{

    private String nome;

    public Corretora(String nome) {
        this.nome = nome;
    }
    
    @Override
    public void notificaAlteracao(Acao acao) {
        System.out.println("Corretora " + this.nome + " sendo notificada: ");
        System.out.println("A ação " + acao.getCodigo() + " teve o seu valor alterado para " + acao.getValor());
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns;

import br.com.gbd.apostiladesignpatterns.estrutural.bridge.GeradorDeArquivo;
import br.com.gbd.apostiladesignpatterns.estrutural.bridge.GeradorDeArquivoTXT;
import br.com.gbd.apostiladesignpatterns.estrutural.bridge.Recibo;

/*
    Autor: <NAME>
    Data: 08/08/2016, 16:09:50
    Arquivo: Bridge
*/

public class Bridge {
    
    public static void testaBridge(){
        GeradorDeArquivo geradorDeArquivoTXT = new GeradorDeArquivoTXT();
        Recibo recibo = new Recibo("Treinamento Design Patterns", "<NAME>", 1000, geradorDeArquivoTXT);

        recibo.geraArquivo();
    }
}
<file_sep>package br.com.gbd.designpatterns.abstractFactory;

import br.com.gbd.apostiladesignpatterns.abstractFactory.Emissor;

/*
    Autor: <NAME>
    Data: 08/08/2016, 09:52:10
    Arquivo: EmissorCreator
*/

public class EmissorCreator {

    public static final int VISA = 0;
    public static final int MASTERCARD = 1;
    
    public Emissor create(int tipoDoEmissor){
        if(tipoDoEmissor == EmissorCreator.VISA){
            return new EmissorVisa();
        } else if (tipoDoEmissor == EmissorCreator.MASTERCARD){
            return new EmissorMastercard();
        } else {
            throw new IllegalArgumentException("Tipo de emissor não suportado"); 
        }
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.estrutural.decorator;

/*
    Autor: <NAME>
    Data: 08/08/2016, 16:59:33
    Arquivo: EmissorBasico
*/

public class EmissorBasico implements Emissor{

    @Override
    public void envia(String msg) {
        System.out.println("Enviando uma mensagem: ");
        System.out.println(msg);
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.comportamental.strategy;

import java.util.List;

/*
    Autor: <NAME>
    Data: 09/08/2016, 15:11:25
    Arquivo: Sorter
*/

public interface Sorter {
    <T extends Comparable<? super T>> List<T> sort(List<T> list);
}
<file_sep>package br.com.gbd.apostiladesignpatterns;

import br.com.gbd.apostiladesignpatterns.estrutural.composicao.Caminho;
import br.com.gbd.apostiladesignpatterns.estrutural.composicao.Trecho;
import br.com.gbd.apostiladesignpatterns.estrutural.composicao.TrechoAndando;
import br.com.gbd.apostiladesignpatterns.estrutural.composicao.TrechoDeCarro;

/*
    Autor: <NAME>
    Data: 08/08/2016, 16:46:28
    Arquivo: Composicao
*/

public class Composicao {

    public static void testaComposicao(){
        Trecho trecho1 = new TrechoAndando("Vá até a rua A.", 500);
        Trecho trecho2 = new TrechoDeCarro("Vá até o cruzamento B.", 1500);
        Trecho trecho3 = new TrechoDeCarro("Vá até o cruzamento C.", 2000);
        
        Caminho caminho1 = new Caminho();
        caminho1.adiciona(trecho1);
        caminho1.adiciona(trecho2);
        
        System.out.println("Caminho1: ");
        caminho1.imprime();
        
        Caminho caminho2 = new Caminho();
        caminho2.adiciona(caminho1);
        caminho2.adiciona(trecho3);
        System.out.println("---------------------------");
        System.out.println("Caminho 2: ");
        caminho2.imprime();
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.criacao.factoryMethod;

/*
    Autor: <NAME>
    Data: 08/08/2016, 09:01:15
    Arquivo: EmissorEmail
*/

public class EmissorEmail implements Emissor{
    
    public void enviar(String mensagem){
        System.out.println("Enviando msg por e-mail");
        System.out.println(mensagem);
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns;

import br.com.gbd.apostiladesignpatterns.criacao.factoryMethod.Emissor;
import br.com.gbd.apostiladesignpatterns.criacao.factoryMethod.EmissorCreator;

/*
    Autor: <NAME>
    Data: 08/08/2016, 10:45:16
    Arquivo: FactoryMethod
*/

public class FactoryMethod {

    public static void testa(){
        String mensagem = "Olá";
        EmissorCreator creator = new EmissorCreator();

        Emissor emissor = creator.create(EmissorCreator.SMS);
        emissor.enviar(mensagem);

        emissor = creator.create(EmissorCreator.EMAIL);
        emissor.enviar(mensagem);

        emissor = creator.create(EmissorCreator.JMS);
        emissor.enviar(mensagem);
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.criacao.multion;

import java.awt.Color;
import java.util.HashMap;
import java.util.Map;

/*
    Autor: <NAME>
    Data: 08/08/2016, 14:56:51
    Arquivo: T
*/

public class Tema {

    private String nome;
    private Color corDoFundo;
    private Color corDaFonte;
    
    private static Map<String, Tema> temas = new HashMap<>();
    
    public static final String SKY = "Sky";
    public static final String FIRE = "Fire";
    
    static {
        Tema tema1 = new Tema();
        tema1.setNome(Tema.SKY);
        tema1.setCorDoFundo(Color.BLUE);
        tema1.setCorDaFonte((Color.BLACK));
        
        Tema tema2 = new Tema();
        tema1.setNome(Tema.FIRE);
        tema1.setCorDoFundo(Color.RED);
        tema1.setCorDaFonte((Color.WHITE));
        
        temas.put(tema1.getNome(), tema1);
        temas.put(tema2.getNome(), tema2);
    }

    private Tema() {
    }
    
    public static Tema getInstance(String nomeDoTema){
        return Tema.temas.get(nomeDoTema);
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Color getCorDoFundo() {
        return corDoFundo;
    }

    public void setCorDoFundo(Color corDoFundo) {
        this.corDoFundo = corDoFundo;
    }

    public Color getCorDaFonte() {
        return corDaFonte;
    }

    public void setCorDaFonte(Color corDaFonte) {
        this.corDaFonte = corDaFonte;
    }

    public static Map<String, Tema> getTemas() {
        return temas;
    }

    public static void setTemas(Map<String, Tema> temas) {
        Tema.temas = temas;
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns;

import br.com.gbd.apostiladesignpatterns.comportamental.mediator.CentralDeTaxi;
import br.com.gbd.apostiladesignpatterns.comportamental.mediator.Passageiro;
import br.com.gbd.apostiladesignpatterns.comportamental.mediator.Taxi;

/*
    Autor: <NAME>
    Data: 09/08/2016, 14:23:19
    Arquivo: Mediator
 */
public class Mediator {

    public static void testaMediator() {
        CentralDeTaxi central = new CentralDeTaxi();

        Passageiro p1 = new Passageiro("José", central);
        Passageiro p2 = new Passageiro("Carlos", central);
        Passageiro p3 = new Passageiro("Freitas", central);

        Taxi t1 = new Taxi(1, central);
        central.adicionaTaxiDisponivel(t1);

        Taxi t2 = new Taxi(2, central);
        central.adicionaTaxiDisponivel(t2);
        
        new Thread(p1).start();
        new Thread(p2).start();
        new Thread(p3).start();
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.comportamental.state;

/*
    Autor: <NAME>
    Data: 09/08/2016, 14:58:56
    Arquivo: Taximetro
*/

public class Taximetro {
    
    private Bandeira bandeira;
    
    public Taximetro(Bandeira bandeira){
        this.bandeira = bandeira;
    }
    
    public void setBandeira(Bandeira bandeira){
        this.bandeira = bandeira;
    }
    
    public double calculaValorDaCorrida(double tempo, double distancia){
        return this.bandeira.calcularValorDaCorrida(tempo, distancia);
    }
}
<file_sep>package br.com.gbd.apostiladesignpatterns.builder;

import java.util.Calendar;

/*
    Autor: <NAME>
    Data: 08/08/2016, 11:07:18
    Arquivo: Boleto
 */
public interface Boleto {

    String getSacado();

    String getCedente();

    double getValor();

    Calendar getVencimento();

    int getNossoNumero();

    String toString();
}
