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... } 当我阅读我的代码时,我觉得非常脏. 有没有办法重构我的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等 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |