把方法作为参数传给另一个方法
1.模板方法:借用外部方法返回结果(例子中的Func<>)
2.回调(callback)方法:调用指定方法(例子中的Action<>)
using System;
using System.ComponentModel;
using System.Dynamic;
namespace test1
{
class Program
{
static void Main(string[] args)
{
ProductFactory productFactory = new ProductFactory();//工厂类
WrapFactory wrapFactory = new WrapFactory();//打包类
//用Func<>委托工厂的制作产品方法
Func<Product> func1 = new Func<Product>(productFactory.MakePizza);
Func<Product> func2 = new Func<Product>(productFactory.MakeToyCar);
//用Action<>委托日志方法
Logger logger = new Logger();
Action<Product> log = new Action<Product>(logger.Log);
//直接调用打包方法,参数为委托的函数
Box box1 = wrapFactory.WrapProduct(func1,log);
Box box2 = wrapFactory.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);
//用UtcNow是因为不带时区,显示的为全球标准时间,Now会带时区
}
}
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,Action<Product> logCallback)
//Func<>委托有返回值的函数,Action委托无返回值的函数
{
Box box = new Box();
//***此处为模板方法
Product product = getProduct.Invoke();//invoke也可以省略
if (product.Price >= 50)
{
//***此处为回调方法
logCallback(product);//当价格高于50元,记录生产时间
}
box.Product = product;
return box;
}
}
class ProductFactory//工厂类
{
public Product MakePizza()
{
Product product = new Product();
product.Name = "Pizza";
product.Price = 12;
return product;
}
public Product MakeToyCar()
{
Product product = new Product();
product.Name = "ToyCar";
product.Price = 100;
return product;
}
}
}