public class Conta
{
public double Saldo { get; private set; }
public double Valor { get; set; }
public DateTime DataAbertura { get; set; }
public void Deposita(double valor)
{
Saldo += valor;
}
}
public abstract class Filtro
{
protected Filtro OutroFiltro { get; private set; }
public Filtro()
{
this.OutroFiltro = null;
}
public Filtro(Filtro outroFiltro)
{
this.OutroFiltro = outroFiltro;
}
public abstract IList<Conta> Filtra(IList<Conta> contas);
protected IList<Conta> ProximoFiltro(IList<Conta> contas)
{
if (this.OutroFiltro == null) return this.OutroFiltro.Filtra(contas);
else return new List<Conta>();
}
}
public class FiltroMenorQue100Reais : Filtro
{
public FiltroMenorQue100Reais()
{ }
public FiltroMenorQue100Reais(Filtro outroFiltro) : base(outroFiltro)
{ }
public override IList<Conta> Filtra(IList<Conta> contas)
{
IList<Conta> filtrada = new List<Conta>();
foreach (Conta c in contas)
{
if (c.Valor < 100) filtrada.Add(c);
}
foreach (Conta c in ProximoFiltro(contas))
{
filtrada.Add(c);
}
return filtrada;
}
}
public class FiltroMaiorQue500Reais : Filtro
{
public FiltroMaiorQue500Reais()
{ }
public FiltroMaiorQue500Reais(Filtro outroFiltro) : base(outroFiltro)
{ }
public override IList<Conta> Filtra(IList<Conta> contas)
{
IList<Conta> filtrada = new List<Conta>();
foreach (Conta c in contas)
{
if (c.Valor > 50000) filtrada.Add(c);
}
foreach (Conta c in ProximoFiltro(contas))
{
filtrada.Add(c);
}
return filtrada;
}
}
public class FiltroMesmoMes : Filtro
{
public FiltroMesmoMes()
{ }
public FiltroMesmoMes(Filtro outroFiltro) : base(outroFiltro)
{ }
public override IList<Conta> Filtra(IList<Conta> contas)
{
IList<Conta> filtrada = new List<Conta>();
foreach (Conta c in contas)
{
if (c.DataAbertura.Month == DateTime.Now.Month && c.DataAbertura.Year == DateTime.Now.Year)
{
filtrada.Add(c);
}
}
foreach (Conta c in ProximoFiltro(contas))
{
filtrada.Add(c);
}
return filtrada;
}
}
class Program
{
static void Main(string[] args)
{
List<Conta> contas = new List<Conta>();
Conta conta = new Conta();
conta.Deposita(90);
contas.Add(conta);
conta = new Conta();
conta.Deposita(550);
contas.Add(conta);
Filtro filtro = new FiltroMenorQue100Reais(new iltroMaiorQue500Reais());
Console.ReadKey();
/// ??????
}
}