• Source
    1. using System;
    2. using System.Collections.Generic;
    3. public interface ValueGetter { List<int> Get(List<int> values); }
    4. public class PlainGetter : ValueGetter {
    5. public List<int> Get(List<int> values) { return values; }
    6. }
    7. public abstract class Decoratable {
    8. protected ValueGetter getter;
    9. public Decoratable(ValueGetter getter) { this.getter = getter; }
    10. }
    11. public class EvenGetter : Decoratable, ValueGetter {
    12. public EvenGetter(ValueGetter getter) : base(getter) {}
    13. public List<int> Get(List<int> values) { return getter.Get(values).FindAll(x => (0 == (x % 2)));
    14. }}
    15. public class OddGetter : Decoratable, ValueGetter {
    16. public OddGetter(ValueGetter getter) : base(getter) {}
    17. public List<int> Get(List<int> values) { return getter.Get(values).FindAll(x => (0 != (x % 2)));}
    18. }
    19. public class Multiples3Getter : Decoratable, ValueGetter {
    20. public Multiples3Getter(ValueGetter getter) : base(getter) {}
    21. public List<int> Get(List<int> values) { return getter.Get(values).FindAll(x => (0 == (x % 3))); }
    22. }
    23.  
    24. public class Test
    25. {
    26. public static void Main()
    27. {
    28. PlainGetter p = new PlainGetter();
    29. EvenGetter e = new EvenGetter(p);
    30. OddGetter o = new OddGetter(p);
    31. Multiples3Getter t = new Multiples3Getter(p);
    32. ValueGetter et = new Multiples3Getter(e);
    33. ValueGetter ot = new Multiples3Getter(o);
    34.  
    35. List<int> list = new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    36. p.Get(list).ForEach(x => System.Console.Write(x+",")); System.Console.WriteLine();
    37. e.Get(list).ForEach(x => System.Console.Write(x+",")); System.Console.WriteLine();
    38. o.Get(list).ForEach(x => System.Console.Write(x+",")); System.Console.WriteLine();
    39. t.Get(list).ForEach(x => System.Console.Write(x+",")); System.Console.WriteLine();
    40. et.Get(list).ForEach(x => System.Console.Write(x+",")); System.Console.WriteLine();
    41. ot.Get(list).ForEach(x => System.Console.Write(x+",")); System.Console.WriteLine();
    42. }
    43. }