3
respostas

Olá a todos. Fiz esse código de exemplo para o padrão Visitor. Gostaria de saber se está ok ??

 public abstract class Empregado
    {

        public abstract void Aceita(VisitorBase visitor);
        public string Nome { get; set; }

        public double SalarioMensal { get; set; }

    }

  public class Gerente : Empregado
    {

        public List<Empregado> Subordinados { get; private set; }

        public Gerente()
        {
            Subordinados = new List<Empregado>();
        }

        public override void Aceita(VisitorBase visitor)
        {
            visitor.Visita(this);

            foreach (Empregado subordinado in Subordinados)
            {
                subordinado.Aceita(visitor);
            }
        }
    }

 public class Trabalhador : Empregado
    {
        public override void Aceita(VisitorBase visitor)
        {
            visitor.Visita(this);
        }
    }

 public abstract class VisitorBase
    {

        public abstract void Visita(Trabalhador empregado);
        public abstract void Visita(Gerente empregado);

    }

  public class EstruturaOrganizacional
    {

        public Empregado Empregado { get; set; }

        public EstruturaOrganizacional(Empregado empregado)
        {
            this.Empregado = empregado;
        }

        public void Aceita(VisitorBase visitor)
        {
            Empregado.Aceita(visitor);
        }

    }

 public class FolhaDePagamentoVisitante : VisitorBase
    {

        double multiplicador = 0;
        public double AumentoTotal { get; private set; }


        public FolhaDePagamentoVisitante() { }

        public FolhaDePagamentoVisitante(double multiplicador)
        {
            this.multiplicador = multiplicador;
            AumentoTotal = 0;
        }

        public override void Visita(Gerente empregado)
        {
            double aumento = empregado.SalarioMensal * multiplicador;
            empregado.SalarioMensal += aumento;
            AumentoTotal += aumento;
            Console.WriteLine("{0} salario aumentado para {1}", empregado.Nome, empregado.SalarioMensal);
        }

        public override void Visita(Trabalhador empregado)
        {
            double aumento = empregado.SalarioMensal * multiplicador;
            empregado.SalarioMensal += aumento;
            AumentoTotal += aumento;
            Console.WriteLine("{0} salario aumentado para {1}.", empregado.Nome,aumento);
        }
    }

  class Program
    {
        static void Main(string[] args)
        {

            Gerente gerente1 = new Gerente();
            gerente1.Nome = "Mauricio";
            gerente1.SalarioMensal = 5000;

            Gerente gerente2 = new Gerente();
            gerente2.Nome = "Suzana";
            gerente2.SalarioMensal = 4000;

            Trabalhador trabalhador1 = new Trabalhador();
            trabalhador1.Nome = "Joao";
            trabalhador1.SalarioMensal = 2000;

            Trabalhador trabalhador2 = new Trabalhador();
            trabalhador2.Nome = "Ricardo";
            trabalhador2.SalarioMensal = 1800;

            Trabalhador trabalhador3 = new Trabalhador();
            trabalhador3.Nome = "Marcio";
            trabalhador3.SalarioMensal = 1900;

            gerente1.Subordinados.Add(gerente2);
            gerente1.Subordinados.Add(trabalhador1);

            gerente2.Subordinados.Add(trabalhador2);
            gerente2.Subordinados.Add(trabalhador3);

            EstruturaOrganizacional org = new EstruturaOrganizacional(gerente1);

            FolhaDePagamentoVisitante fpag_simples = new FolhaDePagamentoVisitante();
            FolhaDePagamentoVisitante fpag_aumento = new FolhaDePagamentoVisitante(0.05);

            org.Aceita(fpag_simples);
            org.Aceita(fpag_aumento);
            org.Aceita(fpag_simples);

            Console.WriteLine("Total pago com aumento = {0}",fpag_aumento.AumentoTotal);


        }
    }
3 respostas

Fiquei na duvida do porque voce adiciona o org.Aceita(fpag_simples); duas vezes.

Funciona né, mas você deveria explicar o motivo que te levou a aplicar. Porque eu rodo, e não da erro, mas não sei o que eu deveria esperar.

Oi Mauricio, tudo bom?

Como o Vilson disse, normalmente um pattern precisa de um motivo. Os padrões de projeto tem um contexto nos quais devem ser aplicados.

Compartilha com a gente qual é sua ideia, qual o contexto do pattern assim fica mais facil a gente discutir sobre ele =)

Abraço!

Então, a minha ideia foi para criar um padrão para mostrar os diferentes cálculos de salário para os diferentes tipos de empregado. Gerentes e seus subordinados. Foi só isso. A minha ideia foi essa. Está ok ou está falha minha lógica para o padrão ??