c# – 如何重构方法调用看起来一样?

c# – 如何重构方法调用看起来一样?,第1张

概述我有不同的水果类,所有实现相同的界面IFruit: public interface IApple : IFruit{ } public interface IBanana : IFruit{ } public interface ICarrot: IFruit{ } 他们每个人都有自己的抽屉: public class AppleDrawer{ public void Draw 我有不同的水果类,所有实现相同的界面IFruit:

public interface IApple : IFruit{ }  public interface IBanana : IFruit{ }  public interface ICarrot: IFruit{ }

他们每个人都有自己的抽屉:

public class AppleDrawer{    public voID Draw(IApple apple,Graphics graphics){}}public class BananaDrawer{    public voID Draw(IBanana banana,Graphics graphics){}}

如果我想画一份水果清单,我会做以下事情

public voID DrawFruits(List<IFruit> fruits,Graphics graphics){    foreach(var fruit in fruits)    {        if(fruit is IBanana)        {            var banana = (IBanana)fruit;            var drawer = new BananaDrawer();            drawer.Draw(banana,graphics);        }        else if(fruit is IApple)        {            var apple = (IApple)fruit;            var drawer = new AppleDrawer();            drawer.Draw(banana,graphics);        }        etc...}

当我阅读我的代码时,我觉得非常脏.
我的问题是多个if..else语句,因为我有12个不同的水果,我必须在我当前的项目中做很多这样的陈述.

有没有办法重构我的DrawFruits方法
我在考虑一种工厂模式,但我真的不知道该怎么做.
我的水果类是否必须将抽屉作为财产?或者也许我可以调用抽屉工厂方法?

这是我在当前项目中发现很多的模式,我找不到满足我的解决方案.

解决方法 一种方法是在你的IFruit上有一个GetDrawer

public interface IFruit {    BaseDrawer GetDrawer();}

和BaseDrawer接口

public interface BaseDrawer{    voID Draw(IFruit fruit,Graphics graphics);}.public class AppleDrawer : BaseDrawer{    public voID Draw(IFruit apple,Graphics graphics) { }}public class BananaDrawer : BaseDrawer{    public voID Draw(IFruit banana,Graphics graphics) { }}

现在你的水果简单

public voID DrawFruits(List<IFruit> fruits,Graphics graphics)    {        foreach (var fruit in fruits)        {            var drawer = fruit.GetDrawer();            drawer.Draw(fruit,graphics);        }    }

有时你需要一个抽屉,绘图仪和打印机,所以你的IFruit可能会变得像下面那样太重了

public interface IFruit {    BaseDrawer GetDrawer();    BasePrinter GetPrinter();    BasePlotter GetPlotter();}

Visitor pattern is a good solution for this.基本上你会有

public interface iFruit   {      voID Accept(FruitVisitor visitor);   }

所有可能的绘图访问只有一个类

public class DrawVisitor : FruitVisitor    {      public overrIDe voID Visit(Apple apple)      {         //draw the apple      }      public overrIDe voID Visit(Banana banana)      {          // draw the banana      }   }

在这里你只有一个DrawVisitor而不是AppleDrawer,BananaDrawer等,你所有的绘图代码都整齐地放在一个地方.您最终可能需要PlotterVisitor,PrinterVisiter等

总结

以上是内存溢出为你收集整理的c# – 如何重构方法调用看起来一样?全部内容,希望文章能够帮你解决c# – 如何重构方法调用看起来一样?所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存