11.3 委托的一般使用 - 图1

模板方法

利用模板方法,提高代码复用性。

下例中 Product、Box、WrapFactory 都不用修改,只需要在 ProductFactory 里面新增不同的 MakeXXX 然后作为委托传入 WrapProduct 就可以对其进行包装。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. ProductFactory productFactory = new ProductFactory();
  6. WrapFactory wrapFactory = new WrapFactory();
  7. //开始使用模板方法
  8. Func<Product> func1 = new Func<Product>(productFactory.MakePizza);
  9. Func<Product> func2 = new Func<Product>(productFactory.MakeToyCar);
  10. Box box1 = wrapFactory.WrapProduct(func1);
  11. Box box2 = wrapFactory.WrapProduct(func2);
  12. Console.WriteLine(box1.Product.Name);
  13. Console.WriteLine(box2.Product.Name);
  14. }
  15. }
  16. class Product //产品
  17. {
  18. public string Name { get; set; }
  19. }
  20. class Box //包装产品的盒子
  21. {
  22. public Product Product { get; set; }
  23. }
  24. class WrapFactory //把产品包上盒子交给用户
  25. {
  26. public Box WrapProduct(Func<Product> getProduct)//模板方法,接受委托类型的参数
  27. {
  28. Box box = new Box();
  29. Product product = getProduct.Invoke();
  30. box.Product = product;
  31. return box;
  32. }
  33. }
  34. class ProductFactory //这个工厂专门用来生产各种产品
  35. {
  36. public Product MakePizza()
  37. {
  38. Product product = new Product();
  39. product.Name = "Pizza";
  40. return product;
  41. }
  42. public Product MakeToyCar()
  43. {
  44. Product product = new Product();
  45. product.Name = "Toy Car";
  46. return product;
  47. }
  48. }

图片.png
Reuse,重复使用,也叫“复用”。代码的复用不但可以提高工作效率,还可以减少 bug 的引入。

良好的复用结构是所有优秀软件所追求的共同目标之一。

回调方法

回调方法是通过委托类型参数传入主调方法的被调用方法,主调方法根据自己的逻辑决定是否调用这个方法。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. ProductFactory productFactory = new ProductFactory();
  6. WrapFactory wrapFactory = new WrapFactory();
  7. //开始使用模板方法
  8. Func<Product> func1 = new Func<Product>(productFactory.MakePizza);
  9. Func<Product> func2 = new Func<Product>(productFactory.MakeToyCar);
  10. Logger logger = new Logger();
  11. Action<Product> log = new Action<Product>(logger.Log);
  12. Box box1 = wrapFactory.WrapProduct(func1,log);
  13. Box box2 = wrapFactory.WrapProduct(func2,log);
  14. Console.WriteLine(box1.Product.Name);
  15. Console.WriteLine(box2.Product.Name);
  16. }
  17. }
  18. class Logger
  19. {
  20. public void Log(Product product)
  21. {
  22. Console.WriteLine("Product '{0}' created at {1}.Price is {2}.",product.Name,DateTime.UtcNow,product.Price);
  23. }
  24. }
  25. class Product //产品
  26. {
  27. public string Name { get; set; }
  28. public double Price { get; set; }
  29. }
  30. class Box //包装产品的盒子
  31. {
  32. public Product Product { get; set; }
  33. }
  34. class WrapFactory //把产品包上盒子交给用户
  35. {
  36. public Box WrapProduct(Func<Product> getProduct,Action<Product> logCallback) //模板方法,接受委托类型的参数
  37. {
  38. Box box = new Box();
  39. Product product = getProduct.Invoke();
  40. if (product.Price>=50)
  41. {
  42. logCallback(product);
  43. }
  44. box.Product = product;
  45. return box;
  46. }
  47. }
  48. class ProductFactory //这个工厂专门用来生产各种产品
  49. {
  50. public Product MakePizza()
  51. {
  52. Product product = new Product();
  53. product.Name = "Pizza";
  54. product.Price = 12;
  55. return product;
  56. }
  57. public Product MakeToyCar()
  58. {
  59. Product product = new Product();
  60. product.Name = "Toy Car";
  61. product.Price = 100;
  62. return product;
  63. }
  64. }

图片.png