首页 > 其他分享 >04_委托的使用_回调方法

04_委托的使用_回调方法

时间:2023-11-15 11:33:04浏览次数:22  
标签:Box product 04 委托 Product new 回调 public Name

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

}
}

标签:Box,product,04,委托,Product,new,回调,public,Name
From: https://www.cnblogs.com/luolele/p/17833450.html

相关文章

  • 委托使用-模板方法
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespace_03_委托的使用_模板方法{//模板方法——“借用”指定的外部方法来产生结果//优点:实现了代码的重复使用,提高代码效率//特点://1.相当于填空题//2.......
  • 【题解 P2048】 超级钢琴
    [NOI2010]超级钢琴题目描述小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐。这架超级钢琴可以弹奏出\(n\)个音符,编号为\(1\)至\(n\)。第\(i\)个音符的美妙度为\(A_i\),其中\(A_i\)可正可负。一个......
  • P1004 [NOIP2000 提高组] 方格取数
    P1004[NOIP2000提高组]方格取数基本思路我想的是搞两次二维DP第一次搞完之后把走过的删掉,然后搞第二次,然而只有\(80pts\)#include<iostream>#include<algorithm>#include<cstdio>usingnamespacestd;intn;intx,y,t;inta[11][11];intdp1[11][11],dp2[11][......
  • Day04java方法
    所有学习内容来自:狂神说javaJava方法详解一、方法java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序集合方法包含于类或对象中方法在程序中被创建,在其他地方被引用设计方法的原则:设计方法时最好保持方法的原子性,就是一个方法值完成一个功能,这......
  • az-204
    https://esi.microsoft.com/getcertificationMicrosoftCertified:AzureDeveloperAssociate-AZ-204MicrosoftAzureDevelopersdesign,build,test,andmaintaincloudsolutions,suchasapplicationsandservices,partneringwithcloudsolutionarchitects,......
  • 国产耗材控制芯片—LCSHA204(兼容ATSHA204A)
    耗材控制作为产品主体的配件或其他配套产品,其已成为企业获取利润的来源之一。如何确保耗材的有效使用,可以通过加密芯片来解决这一问题。加密芯片相当于是耗材的“身份证”,具有加jie密及认证功能,除了可以通过认证识别耗材身份、芯片自带存储用于次数授权,还能防chao版。 LCSHA204......
  • 力扣-704-二分查找
    一、题目力扣链接:https://leetcode.cn/problems/binary-search/description/二、解法思路标准的二分查找题目,常规上有左闭右闭和左闭右开的解法1、左闭右闭classSolution:"""leetcode:704采用左闭右闭的方式,[left,right]区间的定义这就决定了二分法的代......
  • 049-第三代软件开发-软件部署脚本(一)
    第三代软件开发-软件部署脚本(一)文章目录第三代软件开发-软件部署脚本(一)项目介绍软件部署脚本(一)其他方式关键字:Qt、Qml、bash、shell、脚本项目介绍欢迎来到我们的QML&C++项目!这个项目结合了QML(QtMeta-ObjectLanguage)和C++的强大功能,旨在开发出色的用户界面......
  • 046_第三代软件开发-虚拟屏幕键盘
    第三代软件开发-虚拟屏幕键盘文章目录第三代软件开发-虚拟屏幕键盘项目介绍虚拟屏幕键盘关键字:Qt、Qml、虚拟键盘、qtvirtualkeyboard、自定义项目介绍欢迎来到我们的QML&C++项目!这个项目结合了QML(QtMeta-ObjectLanguage)和C++的强大功能,旨在开发出色的用户界面和......
  • 044_第三代软件开发-保存PDF
    第三代软件开发-保存PDF文章目录第三代软件开发-保存PDF项目介绍保存PDF头文件源文件使用关键字:Qt、Qml、pdf、painter、打印项目介绍欢迎来到我们的QML&C++项目!这个项目结合了QML(QtMeta-ObjectLanguage)和C++的强大功能,旨在开发出色的用户界面和高性能的后端逻辑......