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上有一个GetDrawerpublic 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# – 如何重构方法调用看起来一样?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)