我们正在开发一个基于Qt的应用程序,用于浏览和绘制作为3D像素图形处理的卷。应用程序的布局由三个正交的切片视图组成,用户可以在上面画点、圆圈等东西,也可以擦除已经画好的像素。想象一下3D Gimp或MS涂料。
您将如何为不同的交互模式(即油漆工具)设计架构?
我的想法是:
我希望对这一想法提出批评意见。
发布于 2011-10-23 13:21:29
通常,MVC是一种定义相对较大的操作的样式。这与您定义为绘制3d像素的复杂操作并不完全一致。我建议看一看与MVC密切相关的另一种风格,即MVVM。它允许通过您的不同工具在操作的对象之间进行更紧密的绑定,并具有该对象的视图。
发布于 2012-11-17 10:43:31
我不认为建立作为不同的“控制器”的交互模式将很好地为您服务。你的逻辑是什么?控制器是将显示和用户输入绑定到您的模型,但我想象这只是一个画布和一个鼠标指针,那么为什么多控制器?
您可以拥有在模型类中的交互模式之间更改的切换逻辑。您可能不需要在多个控制器中使用它,除非您为用户提供了完全不同的“画布”类型元素和布局。不管是哪种方式,我认为一些设计模式的好选择应该是工厂和/或装饰师,或者类似的东西。
从按钮中收集事件,单击交互模式的调色板(您的意思是这是一种Photoshop/MS绘制的工具条,对吗?)使用该事件作为工厂的输入。这个工厂将生成一个与“工具”接口(或您想称之为它的任何东西)相一致的东西的实例。例如,新生成的工具实例存储在控制器中,以便在用户绘制时随时接收鼠标输入。
如果您想变得复杂--比如可以同时选择一些工具,比如“磁性锁”和“绘图”--您的控制器对实现工具接口的实例的引用需要在运行时进行扩展,比如w/ a责任链模式(或前面提到的装饰器)。现在,前面提到的工厂将制造一个以上的工具。在传递用户的鼠标输入之前,控制器将在命令链中“排列”这些命令。例如,磁性锁“工具”实现在将“沿着链”传递给绘图工具之前,可能会将用户的输入稍微更改为存在于指南上。
发布于 2012-11-17 09:36:54
你的想法基本上是正确的。在State的Design书中也提到了它。您的编辑器有一个当前的工具对象(它实现了一个通用工具接口),并将所有相关的用户交互委托给它(mouseclick、键事件等)。油漆工具、选择工具等类将实现工具界面,并负责处理用户事件序列。
public interface Tool {
void HandleKeyboardEvent(...);
void HandleMouseEvent(...);}
class RectangleTool : Tool { //accumulates drawing state }
当您更改一个工具时,更改的只是当前的工具对象,UI中的其余逻辑将保持不变。
如果您有3个正交视图,那么您可以有3个工具对象或仅仅一个,这取决于您的设计。
https://softwareengineering.stackexchange.com/questions/108179
复制相似问题