委托使用-模板方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _03_委托的使用_模板方法
{
//模板方法 ——“借用”指定的外部方法来产生结果
//优点:实现了代码的重复使用,提高代码效率
//特点:
//1. 相当于填空题
//2. 常位于代码中部
//3. 委托有返回值
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);
//调用模板方法
Box box3 = wrapFactory.WrapProduct2IntoBox2(func1);
Box box4 = wrapFactory.WrapProduct2IntoBox2(func2);
//输出box实例中产品名称
Console.WriteLine(box3.product.Name);
Console.WriteLine(box4.product.Name);
}
}
class Product
{
public string Name { 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)//(2)采用委托时的方法写法,输入一个方法,输出一个box2
{
Box box2 = new Box();
Product product2 = getProduct.Invoke();
box2.product = product2;
return box2;
}
}
class ProductFactory
{
public Product MakePizza()
{
Product product = new Product();
product.Name = "Pizza";
return product;
}
public Product MakeToyCar()
{
Product product = new Product();
product.Name = "ToyCar";
return product;
}
}
}
浙公网安备 33010602011771号