using System; using System.Collections.Generic; public interface ValueGetter { List Get(List values); } public class PlainGetter : ValueGetter { public List Get(List 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 Get(List values) { return getter.Get(values).FindAll(x => (0 == (x % 2))); }} public class OddGetter : Decoratable, ValueGetter { public OddGetter(ValueGetter getter) : base(getter) {} public List Get(List values) { return getter.Get(values).FindAll(x => (0 != (x % 2)));} } public class Multiples3Getter : Decoratable, ValueGetter { public Multiples3Getter(ValueGetter getter) : base(getter) {} public List Get(List 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 list = new List {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(); } }