加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 00:01:57 所属栏目:百科 来源:网络整理
导读:我有不同的水果类,所有实现相同的界面IFruit: public interface IApple : IFruit{ } public interface IBanana : IFruit{ } public interface ICarrot: IFruit{ } 他们每个人都有自己的抽屉: public class AppleDrawer{ public void Draw(IApple apple,Gra
我有不同的水果类,所有实现相同的界面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等

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读