1
resposta

Fiz esse modelo de Padrão Builder para impressão de diferentes tipos de pagamento. Ex: Cheque,Cartão e Dinheiro. Gostaria de saber se está Ok ??

// Este código eu criei pensando no padrão Builder. Uma tela que tenha 3 opções de escolha (Dinheiro,Cartao ou Cheque) e de acordo com esse escolha no botão de imprimir vai gerar o movimento(CHEQUE ou CARTÃO ou DINHEIRO) para impressão com seus respectivos parâmetros. Sendo que nem todos os parâmetros serão usados. Está legal para isso ??

  public class Movimento 
    {
        public string TipoMovimento; // CH = cheque, CA = Cartao ou DN = Dinheiro
        public int CodigoBanco;
        public string Bandeira;
        public string Status; 
        public string DtInicial;
        public string DtFinal;
        public string TipoOperacao; // R=Recebimento,P=Pagamento ou A=ambos
        public double valor;

    }

  public abstract class MovimentoBuilder
    {
        public Movimento Movimento;

        public abstract void TipoMovimento(object tipoRecPag);
        public abstract void CodigoDoBanco(object idBanco);
        public abstract void SituacaoStatus(object situacaoStatus);
        public abstract void DataInicial(object dataInicial);
        public abstract void DataFinal(object dataFinal);
        public abstract void Operacao(object operacao);
        public abstract void BandeiraCartao(object bandeira);
        public abstract void Valor(object valor);


        public void CriarMovimento()
        {
            Movimento = new Movimento();
        }

        public Movimento RecuperaMovimento()
        {
            return Movimento;
        }

    }

  public class Diretor
    {

        public Movimento CriaMovimento(MovimentoBuilder movimentoBuilder,params object[] param)
        {
            movimentoBuilder.CriarMovimento();
            movimentoBuilder.CodigoDoBanco(param[0]);
            movimentoBuilder.SituacaoStatus(param[1]);
            movimentoBuilder.Operacao(param[2]);
            movimentoBuilder.DataInicial(param[3]);
            movimentoBuilder.DataFinal(param[4]);
            movimentoBuilder.TipoMovimento(param[5]);
            movimentoBuilder.Valor(param[6]);
            movimentoBuilder.BandeiraCartao(param[7]);

            return movimentoBuilder.RecuperaMovimento();

        }
    }

  public class ChequeBuilder : MovimentoBuilder
    {

        public override void CodigoDoBanco(object idBanco)
        {
            Movimento.CodigoBanco = Convert.ToInt32(idBanco);
        }

        public override void SituacaoStatus(object situacaoStatus)
        {
            Movimento.Status = Convert.ToString(situacaoStatus);
        }

        public override void DataInicial(object dataInicial)
        {
            Movimento.DtInicial = Convert.ToDateTime(dataInicial).ToShortDateString();
        }

        public override void DataFinal(object dataFinal)
        {
            Movimento.DtFinal = Convert.ToDateTime(dataFinal).ToShortDateString();
        }

        public override void Operacao(object operacao)
        {
            Movimento.TipoOperacao = Convert.ToString(operacao);
        }

        public override void TipoMovimento(object tipoRecPag)
        {
            Movimento.TipoMovimento = Convert.ToString(tipoRecPag);
        }

        public override void BandeiraCartao(object bandeira)
        {
            Movimento.Bandeira = Convert.ToString(bandeira);
        }

        public override void Valor(object valor)
        {
            Movimento.valor = Convert.ToDouble(valor);
        }
    }
  public class CartaoBuilder : MovimentoBuilder
    {


        public override void CodigoDoBanco(object idBanco)
        {
            Movimento.CodigoBanco = Convert.ToInt32(idBanco);
        }

        public override void DataInicial(object dataInicial)
        {
            Movimento.DtInicial = Convert.ToDateTime(dataInicial).ToShortDateString();
        }

        public override void DataFinal(object dataFinal)
        {
            Movimento.DtFinal = Convert.ToDateTime(dataFinal).ToShortDateString();
        }


        public override void Operacao(object operacao)
        {
            Movimento.TipoOperacao = Convert.ToString(operacao);
        }

        public override void SituacaoStatus(object situacaoStatus)
        {
            Movimento.Status = Convert.ToString(situacaoStatus);
        }

        public override void TipoMovimento(object tipoRecPag)
        {
            Movimento.TipoMovimento = Convert.ToString(tipoRecPag);
        }

        public override void BandeiraCartao(object bandeira)
        {
            Movimento.Bandeira = Convert.ToString(bandeira);
        }

        public override void Valor(object valor)
        {
            Movimento.valor = Convert.ToDouble(valor);
        }
    }

  class Program
    {

        static void Main(string[] args)
        {
            object[] Params;
            int codBanco = 10;
            string status = "DEP"; // Depositado
            string operacao = "P"; // P=Pagamento
            DateTime dtInicial = DateTime.Now;
            DateTime dtFinal = DateTime.Now.AddMonths(2);
            string tipoMov = "CH";
            double valor = 100.55;
            string bandeira = string.Empty;

            Params = new object[] {codBanco,status,operacao,dtInicial,dtFinal,tipoMov,valor,bandeira };

            MovimentoBuilder cheque = new ChequeBuilder();
            Diretor dir = new Diretor();

            Movimento chequeMov = dir.CriaMovimento(cheque,Params);


        }
    }
1 resposta

Opa, esse eu não gostei.. geralmente o builder é para ajudar na construção do objeto.. como vc deixou todos os parâmetros como object e ainda passando um array, não vi como o programador poderia ser ajudado... ele teria bastante detalhe da implementação antes de usar o seu builder.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software