码迷,mamicode.com
首页 > 其他好文 > 详细

委托的一般使用

时间:2019-10-12 10:49:40      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:实例   alt   ogr   back   turn   stat   说明   main   actor   

模板方法:

有这么一家厂家,做披萨和玩具车两种Product,并且给他们的产品装在不同的包装盒Box里,我们通过委托的方式给他们的产品装上包装盒。
产品类

    class Product
    {
        public string Name { get; set; }
    }

包装盒类

    class Box
    {
        public Product Product { get; set; }
    }

包装车间类
这里多说一句,包装车间类里有包装产品方法WarpProduct(),这个方法的参数是委托类型的变量getPorduct,
意味着我们要先实例化委托(用委托变量“引用”这个实例)再传入这个委托类型的变量

    class WarpFactory
    {
        public Box WarpProduct(Func<Product> getPorduct)
        {
            Box box = new Box();
            Product product = getPorduct.Invoke();//Product类的product变量去接Product类型对象。
            box.Product = product;
            return box;
        }
    }

这个委托的返回类型是product,则返回类型是product类型的对象

产品工厂类

    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;
        }
    }

主函数类

    class Program
    {
        static void Main(string[] args)
        {
            ProductFactory productfactory = new ProductFactory();
            Func<Product> funcpizza = new Func<Product>(productfactory.MakePizza);
            Func<Product> functoycar = new Func<Product>(productfactory.MakeToyCar);
            WarpFactory warpfactory = new WarpFactory();
            Box pizzabox = warpfactory.WarpProduct(funcpizza);
            Box toycarbox = warpfactory.WarpProduct(functoycar);
            Console.WriteLine(pizzabox.Product.Name);
            Console.WriteLine(toycarbox.Product.Name);
        }
    }

以做Pizza为例:
先创建funcpizza 委托,封装了MakePizza这个方法,
WarpProduct类的WarpProduct方法中

Product product = getPorduct.Invoke();

调用了funcpizza委托,
就跳转到ProductFactory类中MakePizza这个方法里(间接调用)
MakePizza方法创建了一个Product类型的pizza对象
调用完成后会返回间接调用的起点处

Product product = getPorduct.Invoke();

并且通过委托拿到一个Product类型的对象(pizza),并且

box.Product = product;

这个对象(pizza)就传入了box对象,在主函数中这个box又被赋值给对应的Box类型对象(如Box类的pizzabox实例)
就完成了对产品的包装。
结果:
技术图片

模板方法:
技术图片
这就是我们的模板方法,逻辑在上面已经说明。
可以修改的逻辑是委托的调用getPorduct.Invoke(),传进来的委托封装的什么方法,在这里可以得到这个方法产出的产品。
这样写的好处是,我们只需要扩展产品类,而不需要动其他任何地方,最大限度的实现了代码的重复使用。

回调方法(Callback):

委托的一般使用

标签:实例   alt   ogr   back   turn   stat   说明   main   actor   

原文地址:https://www.cnblogs.com/maomaodesu/p/11659834.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!