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);
}
}