php做的网站怎么加密,吉林网站建设司,网盘怎么做电影网站,wordpress 评分点评主题文章目录 委托自定义委托模板方法#xff08;工厂模式回调(callback)函数#xff08;观察者模式多播#xff08;multicast#xff09;委托委托的高级使用使用接口 重构 模板方法代码注意参考 委托 委托#xff08;delegate#xff09;是一种类型#xff0c;定义了一种方… 文章目录 委托自定义委托模板方法工厂模式回调(callback)函数观察者模式多播multicast委托委托的高级使用使用接口 重构 模板方法代码注意参考 委托 委托delegate是一种类型定义了一种方法签名因此可以将方法作为参数进行传递。 委托类似于 C 中的函数指针但比函数指针更加安全和灵活。 使用委托可以实现事件处理、回调函数等功能。 建议使用接口取代委托 Action 无参无返回 Func 有参有返回 Calaculator calaculator new Calaculator();// Actionnew Action(calaculator.Report).Invoke();// FuncFuncint, int, int func1 new Funcint, int, int(calaculator.Add);Funcint, int, int func2 new Funcint, int, int(calaculator.Sub);int x 100;int y 200;int z 0;// 可以省略invokez func1(x, y);Console.WriteLine(z);z func2.Invoke(x, y);Console.WriteLine(z);class Calaculator {public void Report(){Console.WriteLine(i have 3 methods);}public int Add(int a, int b){return a b;}public int Sub(int a, int b){return a - b;}
}自定义委托
// 与类平级放到类中属于嵌套
public delegate double Calc(double x,double y);
internal class Program
{static void Main(string[] args){Calaculator calaculator new Calaculator();Calc calc1 new Calc(calaculator.Add1);Calc calc2 new Calc(calaculator.Mul);double x 100;double y 100;double z 0;z calc1.Invoke(x, y);Console.WriteLine(z);z calc2.Invoke(x, y);Console.WriteLine(z);}
}模板方法工厂模式 ”借用“指定的外部方法来产生结果 提高对代码的复用 ProductFactory() 只需要扩展这个方法其他方法都不用动 static void Main(string[] args){ProductFactory productFactory new ProductFactory();WrapFactory wrapFactory new WrapFactory();FuncProduct func1 new FuncProduct(productFactory.MakeToy);FuncProduct func2 new FuncProduct(productFactory.MakePizza);Box box1 wrapFactory.WrapProduct(func1);Box box2 wrapFactory.WrapProduct(func2);Console.WriteLine(box1.Product.Name);Console.WriteLine(box2.Product.Name);}
}class Product() { public string Name { get; set; }
}class Box() { public Product Product { get; set; }
}class WrapFactory {public Box WrapProduct(FuncProduct getProduct) {Box box new Box();// invoke 执行拿到产品不用管是什么产品Product product getProduct.Invoke();box.Product product;return box;}
}class ProductFactory() {public Product MakePizza() {Product product new Product();product.Name Pizza;return product;}public Product MakeToy() {Product product new Product();product.Name Toy;return product;}
}回调(callback)函数观察者模式 调用指定的外部方法 在模板方法基础上添加 internal class Program
{static void Main(string[] args){ProductFactory productFactory new ProductFactory();WrapFactory wrapFactory new WrapFactory();FuncProduct func1 new FuncProduct(productFactory.MakeToy);FuncProduct func2 new FuncProduct(productFactory.MakePizza);Logger logger new Logger();ActionProduct action new ActionProduct(logger.Log);Box box1 wrapFactory.WrapProduct(func1,action);Box box2 wrapFactory.WrapProduct(func2,action);Console.WriteLine(box1.Product.Name);Console.WriteLine(box2.Product.Name);}
}class Logger {public void Log(Product product) {//DateTime.UtcNow 无时区时间 ; DateTime.Now 有时区Console.WriteLine(Product {0} created at {1}.Price is {2},product.Name,DateTime.UtcNow,product.Price);}
}class Product() { public string Name { get; set; }public double Price{ get; set; }
}class Box() { public Product Product { get; set; }
}class WrapFactory {public Box WrapProduct(FuncProduct getProduct,ActionProduct logCallback) {Box box new Box();Product product getProduct.Invoke();// 回调函数触发某种条件就自动执行if (product.Price 50) {logCallback(product);}box.Product product;return box;}
}class ProductFactory() {public Product MakePizza() {Product product new Product();product.Name Pizza;product.Price 12;return product;}public Product MakeToy() {Product product new Product();product.Name Toy;product.Price120;return product;}
}多播multicast委托 委托的高级使用 使用接口 重构 模板方法代码
直接用接口不使用委托。
方法形参为接口类继承接口new不同的类传进同个方法
internal class Program
{static void Main(string[] args){WrapFactory wrapFactory new WrapFactory();Logger logger new Logger();ActionProduct action new ActionProduct(logger.Log);Box box1 wrapFactory.WrapProduct(new PizzaFactory());Box box2 wrapFactory.WrapProduct(new ToyCarFactory());Console.WriteLine(box1.Product.Name);Console.WriteLine(box2.Product.Name);}
}interface IProductFactory {Product Make();
}class PizzaFactory : IProductFactory
{public Product Make(){Product product new Product();product.Name Pizza;product.Price 12;return product;}
}class ToyCarFactory : IProductFactory
{public Product Make(){Product product new Product();product.Name Toy;product.Price 120;return product;}
}
class WrapFactory {public Box WrapProduct(IProductFactory productFactory) {Box box new Box();Product product productFactory.Make();box.Product product;return box;}
}
}注意
委托
参考
刘铁猛——C#