资料源于刘铁猛的C#视频教程
模板方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Del { public delegate double Calc(double x, double y);//委托是类申明时与类平级 class Program { static void Main(string[] args) { ProductFactory proFac = new ProductFactory(); WrapFactory wrapFac = new WrapFactory(); Func<Product> func1 = new Func<Product>(proFac.MakePizza); Func<Product> func2 = new Func<Product>(proFac.MakeToyCar); Box box1 = wrapFac.WrapProduct(func1); Box box2 = wrapFac.WrapProduct(func2); Console.WriteLine(box1.Product.Name); Console.WriteLine(box2.Product.Name); } } class Logger { public void Log(Product product) { Console.WriteLine("Product {0} created at {1}. Price is {2}. ", product.Name, DateTime.UtcNow, product.Price); } } class Product { public string Name { get; set; } public double Price { get; set; } } class Box { public Product Product { get; set; } } class WrapFactory { public Box WrapProduct(Func<Product> getProduct)//函数模板 { Box box = new Box(); Product product = getProduct.Invoke(); box.Product = product; return box; } } class ProductFactory { public Product MakePizza() { Product product = new Product(); product.Name = "Pizza"; return product; } public Product MakeToyCar() { Product product = new Product(); product.Name = "Toy Car"; return product; } } }
回调方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Del { public delegate double Calc(double x, double y);//委托是类申明时与类平级 class Program { static void Main(string[] args) { ProductFactory proFac = new ProductFactory(); WrapFactory wrapFac = new WrapFactory(); Func<Product> func1 = new Func<Product>(proFac.MakePizza); Func<Product> func2 = new Func<Product>(proFac.MakeToyCar); Logger logger = new Logger(); Action<Product> log = new Action<Product>(logger.Log); Box box1 = wrapFac.WrapProduct(func1, log); Box box2 = wrapFac.WrapProduct(func2, log); Console.WriteLine(box1.Product.Name); Console.WriteLine(box2.Product.Name); } } class Logger { public void Log(Product product) { Console.WriteLine("Product {0} created at {1}. Price is {2}. ", product.Name, DateTime.UtcNow, product.Price); } } class Product { public string Name { get; set; } public double Price { get; set; } } class Box { public Product Product { get; set; } } class WrapFactory { //没有返回值的用action委托 public Box WrapProduct(Func<Product> getProduct, Action<Product> logCallback) { Box box = new Box(); Product product = getProduct.Invoke(); if (product.Price >= 50) { logCallback(product); } box.Product = product; return box; } } class ProductFactory { public Product MakePizza() { Product product = new Product(); product.Name = "Pizza"; product.Price = 15; return product; } public Product MakeToyCar() { Product product = new Product(); product.Name = "Toy Car"; product.Price = 150; return product; } } }