using System;
using System.Collections.Generic;
public interface ValueGetter { List<int> Get(List<int> values); }
public class PlainGetter : ValueGetter {
public List<int> Get(List<int> values) { return values; }
}
public abstract class Decoratable {
protected ValueGetter getter;
public Decoratable(ValueGetter getter) { this.getter = getter; }
}
public class EvenGetter : Decoratable, ValueGetter {
public EvenGetter(ValueGetter getter) : base(getter) {}
public List<int> Get(List<int> values) { return getter.Get(values).FindAll(x => (0 == (x % 2)));
}}
public class OddGetter : Decoratable, ValueGetter {
public OddGetter(ValueGetter getter) : base(getter) {}
public List<int> Get(List<int> values) { return getter.Get(values).FindAll(x => (0 != (x % 2)));}
}
public class Multiples3Getter : Decoratable, ValueGetter {
public Multiples3Getter(ValueGetter getter) : base(getter) {}
public List<int> Get(List<int> values) { return getter.Get(values).FindAll(x => (0 == (x % 3))); }
}
public class Test
{
public static void Main()
{
PlainGetter p = new PlainGetter();
EvenGetter e = new EvenGetter(p);
OddGetter o = new OddGetter(p);
Multiples3Getter t = new Multiples3Getter(p);
ValueGetter et = new Multiples3Getter(e);
ValueGetter ot = new Multiples3Getter(o);
List<int> list = new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
p.Get(list).ForEach(x => System.Console.Write(x+",")); System.Console.WriteLine();
e.Get(list).ForEach(x => System.Console.Write(x+",")); System.Console.WriteLine();
o.Get(list).ForEach(x => System.Console.Write(x+",")); System.Console.WriteLine();
t.Get(list).ForEach(x => System.Console.Write(x+",")); System.Console.WriteLine();
et.Get(list).ForEach(x => System.Console.Write(x+",")); System.Console.WriteLine();
ot.Get(list).ForEach(x => System.Console.Write(x+",")); System.Console.WriteLine();
}
}