c# – 面向对象的设计模式,以避免ifthenelse语句

c# – 面向对象的设计模式,以避免ifthenelse语句,第1张

概述因为我对OOP / C#相对较新,我不知道解决这个问题的正确模式: 我必须为不同的IO提供商构建一个插件架构. 主机从配置中读取所需的提供程序名称/类型,然后它应该是提供程序实例化和参数化. 所以我基本上有这个接口: public interface IoProvider //(Base interface, all Providers implements this){ void In 因为我对OOP / C#相对较新,我不知道解决这个问题的正确模式:

我必须为不同的IO提供商构建一个插件架构.
主机从配置中读取所需的提供程序名称/类型,然后它应该是提供程序实例化和参数化.

所以我基本上有这个接口:

public interface IoProvIDer //(Base interface,all ProvIDers implements this){    voID Initialize();    voID Execute();}public interface IfileProvIDer: IoProvIDer{    string PropertyA { get; set; }}public interface ISmtpProvIDer : IoProvIDer{    string PropertyB { get; set; }    string PropertyC { get; set; }}

如您所见,派生的专用IO提供程序具有基本接口所没有的不同附加参数属性.
为了避免if / then / else或switch语句我的想法是使用工厂模式.

但如果我理解正确,它不能解决我的if / then / else问题,因为在客户端我必须检查派生类型以提供正确的参数.

所以Host上的程序流程是这样的:
主机读取配置,获取所需提供商的名称/类型
主机调用Factory并获取提供者

但是如何避免这种情况 – 有没有if / then / else解决这个问题的模式?

If (provIDer == typeOf(IfileProvIDer))  PropertyA = value  else if (provIDer == typeOf(ISmtpProvIDer))  PropertyB = value  PropertyC = value  Elseif …
@H_419_22@解决方法 您可以使用多态替换switch语句.只允许每个提供程序从config配置自己.这是一个最佳选择,因为每个提供程序都知道要查找的值:
provIDer.Configure();

此方法应存在于基接口中:

public interface IoProvIDer {    voID Initialize();    voID Execute();    voID Configure();}

每个提供商都实现它:

public interface ISmtpProvIDer : IoProvIDer{    string PropertyB { get; set; }    string PropertyC { get; set; }    public voID Configure()    {        PropertyB = ConfigurationManager.AppSettins["B"];        PropertyB = ConfigurationManager.AppSettins["C"];    }}

这种方法的主要好处是,只有一个地方可以更改,当新的提供程序添加到您的应用程序时 – 只需添加新的提供程序类,它知道如何自行配置.您也不需要更改主机实现.并且您的主机将满足OCP原则 – 打开扩展(您可以添加新的提供程序),但关闭以进行修改(您不需要在添加新提供程序时修改现有代码).

您还可以将一些配置对象传递给Configure(IConfiguration config)到此方法(它将使您的代码可测试,而不依赖于静态ConfigurationManager).

@H_419_22@ @H_419_22@ 总结

以上是内存溢出为你收集整理的c# – 面向对象的设计模式,以避免if / then / else语句全部内容,希望文章能够帮你解决c# – 面向对象的设计模式,以避免if / then / else语句所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1261334.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存