我有不同的水果类,它们都实现了同一个接口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方法的方法?
我正在考虑一种工厂模式,但我不太清楚如何实现。
我的水果类必须将Drawer作为属性吗?或者我可以调用一个Drawer工厂方法?
这是我在当前项目中经常遇到的一种模式,我找不到令我满意的解决方案。
IFruitDrawer
? - Cody Gray