using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _04_委托的使用_回调方法
{
class Program
{
static void Main(string[] args)
{
ProductFactory productFactory = new ProductFactory();//生产产品的工厂实例
WrapFactory wrapFactory = new WrapFactory();//包装产品的工厂实例
///(1)不采用委托时,直接调用方法
//把productFactory中生产的Pizza,包装到box1
Product p = productFactory.MakePizza();//生产产品
Box box1 = wrapFactory.WrapProduct1IntoBox1(p);//包装
//把productFactory中生产的ToyCar,包装到box2
Product t = productFactory.MakeToyCar();//生产产品
Box box2 = wrapFactory.WrapProduct1IntoBox1(t);//包装
//输出box实例中产品名称
Console.WriteLine(box1.product.Name);
Console.WriteLine(box2.product.Name);
///(2)采用委托时,使用委托间接调用方法
//通过委托指定方法
Func<Product> func1 = new Func<Product>(productFactory.MakePizza);
Func<Product> func2 = new Func<Product>(productFactory.MakeToyCar);
//声明Log实例
Logger logger = new Logger();
Action<Product> log = new Action<Product>(logger.Log);
//调用模板方法
Box box3 = wrapFactory.WrapProduct2IntoBox2(func1,log);
Box box4 = wrapFactory.WrapProduct2IntoBox2(func2,log);
//输出box实例中产品名称
Console.WriteLine(box3.product.Name);
Console.WriteLine(box4.product.Name);
}
}
class Logger
{
public void Log(Product product)
{
Console.WriteLine("Product {0} create at {1},price is {2}.",product.Name,DateTime.Now,product.Price);
}
}
class Product
{
public string Name { get; set; }//产品类,该产品有个名字
public double Price { get; set; }
}
class Box
{
public Product product { get; set; }//包装箱类,内部装有一个product类型的属性,指代这个包装内的产品
}
class WrapFactory//这个类负责把某个产品Product包装进某个箱子Box
{
//模板方法
public Box WrapProduct1IntoBox1(Product product1)//(1)不采用委托时的方法写法,输入一个product1,输出一个box1
{
Box box1 = new Box();
box1.product = product1;
return box1;
}
public Box WrapProduct2IntoBox2(Func<Product> getProduct,Action<Product> logCallback)//(2)采用委托时的方法写法,输入一个方法,输出一个box2
{
Box box2 = new Box();
Product product2 = getProduct.Invoke();
//添加逻辑决定是不是调用这个回调方法
if (product2.Price>=50)
{
logCallback(product2);
}
box2.product = product2;
return box2;
}
}
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 = 150;
return product;
}
}
}