我有一个StatBarView
类,其中包含Stat
,int
命名百分比和两个Color
。在Update()
方法中,我可以平滑地改变条形图的百分比值,它有多充实。接下来,我有四个Draw()
方法,一个用于绘制小的条形图,一个用于绘制介质,一个用于大型,一个用于将其绘制为文本而不是图形。
它有效,但是......如果我想实现更多的绘图案例,我觉得这会变得一团糟。
我可以将“文本视图”转换为它自己的StatTextView
,但这只会将问题移到其他地方。我还想避免将各种参数传递给draw方法,如果我想改变一些东西的大小,它会让我到处运行。我还想避免一些使用switch语句的大量方法,感觉更糟。
我考虑过IStatBarContext
传递Draw(int percentage)
,这会有效,但感觉非常复杂。
我是否必须在Stat.Draw(spriteBatch, position, new StatBarLarge())
的每次迭代时调用Draw()
?这是每秒无用的新对象。此外,new StatBarString()
不会使用该百分比统计数据。我想我的设计出了问题。
那就是说,我不知道如何让这个代码变得更干净。有人会帮助我吗?
答案 0 :(得分:2)
听起来你的最后一个例子/选择就是现场。它甚至有一个名称,策略模式。
在这个模式的基于类的版本中,通常每次都会传入一个new
对象(如在您的示例中),但因为这是在Draw
方法中,我只会存储在您班级中的每个策略的样本,并传递现有的参考。
实现此模式的另一种方法是使用委托。为此,您可以使用Draw
方法获取所需信息的代理人。类似的东西:
public void Draw(SpriteBatch spriteBatch, Vector3 position, Action<int> drawStrategy)
{
...
drawStrategy(percentage);
}
然后,您可以将大,小,文本等函数传递给此函数。 Action<int>
当然只是一个示例,您可以根据需要返回值或采用其他参数。
如果文本版本不使用百分比,那么 是一种代码味道,但您可能不需要担心它。 战略绝对是走到这里的方式。