Day3 学习WPF之委托以致用
1、模板方法,“借用”指定的外部方法来产生结果,委托有返回值
Func<Product> func1 = new Func<Product>(productFactory.MakePizza);
Func类型的委托,尖括号<>内第一个参数为返回值类型,若后面还有参数则为输入参数列表。
圆括号()里面的内容,类似将函数指针指向productFactory.MakePizza()这个方法。
通过委托间接调用了productFactory.MakePizza的逻辑
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DelegateDemo
{
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);
Box box1 = wrapFactory.WrapProduct(func1);//用Box类型的变量接收
Box box2 = wrapFactory.WrapProduct(func2);
Console.WriteLine(box1.Product.Name);
Console.WriteLine(box2.Product.Name);
}
}
class Product //定义一个product类,每个产品有一个自己的属性(名字)
{
public string Name { get; set; }
}
class Box //定义一个box类,每个包装箱里面有个属性是product类型的,就是这个箱子里包装的产品
{
public Product Product { get; set; }
}
class WrapFactory //负责把产品包上盒子然后交给用户
{
public Box WrapProduct(Func<Product>getProduct)//getproduct为委托名,返回值类型为Product,参数列表为空
//方法WrapProduct,这个方法就是模板,接收一个委托类型的参数,委托选择Func,返回一个product类型的参数
//作用:将product放入box中
//模板方法
{
Box box = new Box();//准备一个box
Product product = getProduct.Invoke();//间接调用,当执行Func<Product>(productFactory.MakePizza);时,将productFactory.MakePizza()方法传给getproduct
box.Product = product;
return box;
}
}
class ProductFactory
{
public Product MakePizza()//方法:返回值类型为Product
{
Product product = new Product();
product.Name = "Pizza";
return product;
}
public Product MakeToyCar()
{
Product product = new Product();
product.Name = "Toy Car";
return product;
}
}
}
2、回调方法,调用指定的外部方法,委托无返回值
Action<Product>logCallback该方法只有一个参数,并且不返回值(Action类型的委托不具有返回值,但可以有参数列表)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DelegateDemo
{
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();//创建logger实例调用log
Action<Product> log = new Action<Product>(logger.Log);//无返回值的委托Action
Box box1 = wrapFactory.WrapProduct(func1,log);//用Box类型的变量接收
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不带时区的时间
}
}
class Product //定义一个product类,每个产品有一个自己的属性(名字)
{
public string Name { get; set; }
public double Price { get; set; }
}
class Box //定义一个box类,每个包装箱里面有个属性是product类型的,就是这个箱子里包装的产品
{
public Product Product { get; set; }
}
class WrapFactory //负责把产品包上盒子然后交给用户
{
public Box WrapProduct(Func<Product>getProduct,Action<Product>logCallback)//getproduct为委托名,返回值类型为Product,参数列表为空
//方法WrapProduct,返回Box类型;Func类型的委托返回Product类型;Action类型的委托接收一个product类型的参数
//作用:将product放入box中
{
Box box = new Box();//准备一个box
Product product = getProduct.Invoke();//间接调用,当执行Func<Product>(productFactory.MakePizza);时,将productFactory.MakePizza()方法传给getproduct
if (product.Price >= 50)
{
logCallback(product);//如果产品价格大于50就记录一下
}
box.Product = product;
return box;
}
}
class ProductFactory
{
public Product MakePizza()//方法:返回值类型为Product
{
Product product = new Product();
product.Name = "Pizza";
product.Price = 12;
return product;
}
public Product MakeToyCar()
{
Product product = new Product();
product.Name = "Toy Car";
product.Price = 100;
return product;
}
}
}