Strategy模式与Delegate委托

简介:

Strategy模式是对算法的封装。即使是一个计算行为,如果其实现有其多样性,为达到易扩展的目的,我们也有必要将其抽象出来,以接口的形式来定义。由于充分利用了面向 对象的多态性,在调用该行为时,其具体的实现是在运行期决定的。以税收计算为例,假定税收策略分为个人所得税,和企业所得税。根据策略模式,将税收策略抽象为接口ITaxStrategy

public interface ITaxStrategy
{
     double Calculate(double income);
}

各种税收策略均实现该类:

public class PeronalTaxStrategy:ITaxStrategy
{
      public double Calculate(double income)
      {
            //实现;
      }
}
public class EnterpriseTaxStrategy:ITaxStrategy
{
      public double Calculate(double income)
      {
            //实现;
      }
}

如果此时有一个公共的类,提供税收的相关操作,其中就包括计算所得税的方法:

public class TaxOp
{
      private ITaxStrategy strategy;
      public TaxOp(ITaxStrategy strategy)
      {
            this.strategy = strategy;
      }
      public double GetTax(double income)
      {
             return strategy.Calculate(income);
      }
}

客户端调用:

public class App
{
      public static void Main(string[] args)
      {
            TaxOp op = new TaxOp(new PersonalTaxStrategy());
            Console.WriteLine("The Personal Tax is :{0}", op.GetTax(1000));
      }
}

这是一种典型的面向对象的设计思路。然而,对于一些简单的算法行为,我们也可以利用delegate委托的方式,来实现以上的设计,它虽然更近似于面向过程的设计,但其扩展性同样灵活。如果算法的逻辑不复杂,且算法的实现处于某种待定的状态,也许使用委托会比Strategy模式更方便。

 

我们同样利用上述的例子,只是将原来抽象出来的接口修改为委托:

public delegate double CalculateTax(double income);

 

对于个人所得税和企业所得税的实现,相应修改为:

public class Tax
{
      public static double CalculatePersonalTax(double income)
      {
            //实现;
      }
      public static double CalculateEnterpriseTax(double income)
      {
            //实现;
      }
}

税收的公共类则修改如下:

public class TaxOp
{
      private CalculateTax calDel;
      public TaxOp(CalculateTax calDel)
      {
            this.calDel = calDel;
      }
      public double GetTax(double income)
      {
             return calDel(income);
      }
}

客户端的调用:

public class App
{
      public static void Main(string[] args)
      {
            TaxOp op = new TaxOp(new CalculateTax(Tax.CalculatePersonalTax));
            Console.WriteLine("The Personal Tax is :{0}", op.GetTax(1000));
      }
}

从这两个实现方案来看,代码是大同小异的,但设计思想则迥然不同。它是面向对象和面向过程的区别,前者是将行为封装为对象,而后者则直接对方法进行操作,同时又利用delegate委托来实现扩展。个人意见,我还是倾向于第一种方案,但后者至少也提供了一种思路。尤有甚者,我们也可以将委托理解为一种特殊的抽象,因为其本质是函数指针,它代表了一簇函数,从而对具有相同特性的行为进行了普遍意义的抽象。也许,这样可以促进对委托的理解。








本文转自wayfarer51CTO博客,原文链接:http://blog.51cto.com/wayfarer/279905,如需转载请自行联系原作者

相关文章
|
Cloud Native Go Windows
Windows 11 电脑如何设置自动开机 (Windows 11 2022H2)
Windows 11 电脑如何设置自动开机 (Windows 11 2022H2)
4106 0
|
XML 编译器 Android开发
Kotlin DSL 实战:像 Compose 一样写代码
Kotlin DSL 实战:像 Compose 一样写代码
565 0
|
机器学习/深度学习 算法
R语言超参数调优:深入探索网格搜索与随机搜索
【9月更文挑战第2天】网格搜索和随机搜索是R语言中常用的超参数调优方法。网格搜索通过系统地遍历超参数空间来寻找最优解,适用于超参数空间较小的情况;而随机搜索则通过随机采样超参数空间来寻找接近最优的解,适用于超参数空间较大或计算资源有限的情况。在实际应用中,可以根据具体情况选择适合的方法,并结合交叉验证等技术来进一步提高模型性能。
1317 5
|
Linux C# 开发者
用Visual Basic打造桌面与移动应用:跨平台开发的探讨
【4月更文挑战第27天】本文探讨了Visual Basic在跨平台应用开发中的运用,从桌面应用到移动应用,包括使用.NET框架、Xamarin及Mono等工具。Visual Basic结合这些技术,能在Windows、Linux、macOS及移动操作系统上创建应用。开发者需考虑平台兼容性、性能优化和持续维护,通过案例研究和最佳实践,展现VB在多平台开发的潜力。随着工具的改进,Visual Basic在跨平台开发领域将持续发挥作用。
541 3
|
存储 搜索推荐 数据库
运用LangChain赋能企业规章制度制定:深入解析Retrieval-Augmented Generation(RAG)技术如何革新内部管理文件起草流程,实现高效合规与个性化定制的完美结合——实战指南与代码示例全面呈现
【10月更文挑战第3天】构建公司规章制度时,需融合业务实际与管理理论,制定合规且促发展的规则体系。尤其在数字化转型背景下,利用LangChain框架中的RAG技术,可提升规章制定效率与质量。通过Chroma向量数据库存储规章制度文本,并使用OpenAI Embeddings处理文本向量化,将现有文档转换后插入数据库。基于此,构建RAG生成器,根据输入问题检索信息并生成规章制度草案,加快更新速度并确保内容准确,灵活应对法律与业务变化,提高管理效率。此方法结合了先进的人工智能技术,展现了未来规章制度制定的新方向。
709 3
|
Linux 网络安全 数据处理
【专栏】Linux下的xxd命令是一个强大的二进制数据处理工具,用于十六进制转储和数据分析,我教你应该如何使用!
【4月更文挑战第28天】Linux下的xxd命令是一个强大的二进制数据处理工具,用于十六进制转储和数据分析。它可以显示文件的十六进制和ASCII表示,方便查看内容、分析数据结构和比较文件。xxd支持指定输出格式、写入文件、数据提取和转换等功能。在网络安全分析、程序调试和数据恢复等领域有广泛应用。通过掌握xxd,用户能更深入理解和处理二进制数据。
1749 0
|
机器学习/深度学习 数据可视化 PyTorch
Pytorch 最全入门介绍,Pytorch入门看这一篇就够了(二)
Pytorch 最全入门介绍,Pytorch入门看这一篇就够了
520 2
|
自然语言处理 JavaScript Java
CodeFuse新开源模型荣登Big Code评测榜首!
使用多任务高效微调框架MFTCoder,以DeepSeek-Coder-33b模型为底座,微调获得的CodeFuse-DeepSeek-33b模型在Big Code Models Leaderboard代码大模型榜单上以43.58% WinRate成为新晋榜首,同时模型在NLP任务上也取得了很好的表现。本文我们将介绍该模型的得来和使用,包括训练数据、训练超参设置、模型评测效果以及如何获取该模型和基于它继续微调。我们已经在HuggingFace和ModelScope开放了模型下载(下载地址在文末),并同步提供了4bit量化版本供大家直接部署到生产环境。
878 0
|
Kubernetes 负载均衡 网络协议
k8s教程(service篇)-概念和原理(中)
k8s教程(service篇)-概念和原理
580 0
|
负载均衡 应用服务中间件 Linux
万字详解Nginx技术
Nginx 是一个很强大的高性能 Web 和反向代理服务,它具有很多非常优越的特性:在连接高并发的情况下,Nginx 是 Apache 服务不错的替代品. 这里为你揭开它的神秘面纱......
万字详解Nginx技术