模板方法:"借用"指定的外部方法来产生结果,有返回值,常位于代码中部
回调方法:调用指定的外部方法,无返回值,常位于代码末尾
using System;
namespace six_GreatCallBackDelegate
{
internal class Program
{
static void Main(string[] args)
{
WrapFactory wrapFactory = new WrapFactory();
ProductFactory productFactory = new ProductFactory();
Logger logger = new Logger();
Func<Product> func1 = new Func<Product>(productFactory.MakePizza);
Func<Product> func2 = new Func<Product>(productFactory.MakeCar);
Action<Product> action = new Action<Product>(logger.Log);
Box box = wrapFactory.ProductFactory(func1, action);
Box box2 = wrapFactory.ProductFactory(func2, action);
Console.WriteLine(box.Product.Name);
Console.WriteLine(box2.Product.Name);
}
}
class Product
{
public string Name { get; set; }
public double Price { get; set; }
}
class Box
{
public Product Product { get; set; }
}
class Logger
{
public void Log(Product product)
{
//这里为什么要使用UtcNow
//如果使用Nox的话,是带有时区的,假设我们要将这个数据传入到数据库里面,需要不带有时区的数值
Console.WriteLine("Product “{0}” created at {1} ,Pirce is {2}",product.Name,DateTime.UtcNow,product.Price);
}
}
class WrapFactory
{
//如何判断使用Func和Action
//Func带有返回值
//Action不带有返回值
public Box ProductFactory(Func<Product>getProduct,Action<Product>getLogger)
//不论模板方法还是回调方法,本质都是一样,都是通过委托封装一个外部方法,然后把这个方法放进我们方法的内部进行间接调用
{
Box box = new Box();
Product product = getProduct.Invoke();
//当价格大于50的时候,调用日志
if (product.Price >= 50)
{
getLogger(product);
}
box.Product = product;
return box;
}
}
class ProductFactory
{
public Product MakePizza()
{
Product product = new Product();
product.Name = "Pizza";
product.Price = 10;
return product;
}
public Product MakeCar()
{
Product product = new Product();
product.Name = "Car";
product.Price = 50;
return product;
}
}
}
总结:
不论模板方法还是回调方法,其实本质上都是一样的,都是通过委托类型的参数,封装一个外部的方法,然后把这个方法传进我们方法的内部,再进行间接调用