委托:模板方法,优点:更好的代码复用,只需要扩展产品工厂的产品就可以了。
本质:委托类型的参数封装一个外部的方法,传进内部进行外部方法的一个调用。
namespace Delegete02
{
//委托:模板方法,优点:更好的代码复用,只需要扩展产品工厂的产品就可以了。
class Program
{
static void Main(string[] args)
{
//
ProductFactory productFactory = new ProductFactory();
WrapFactory wrapFactory = new WrapFactory();
Func<Product> func1 = new Func<Product>(productFactory.MakePizza);
Func<Product> func2 = new Func<Product>(productFactory.MakeToyCar);
Logger logger = new Logger();
Action<Product> action = new Action<Product>(logger.log);
Box box1 = wrapFactory.WrapProduct(func1,action);
Box box2 = wrapFactory.WrapProduct(func2,action);
Console.WriteLine(box1.Product.Name);
Console.WriteLine(box2.Product.Name);
Console.ReadLine();
}
}
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,Action<Product> action)
{
Box box = new Box();
Product product = getProduct.Invoke();
if (product.Price > 50)
{
action(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 MakeToyCar()
{
Product product = new Product();
product.Name = "Toy car";
product.Price = 100;
return product;
}
}
}