模型的绘图信息(坐标、图像等)在MVP模式中属于什么位置?
本文关键字:模式 MVP 属于 位置 什么 信息 绘图 坐标 图像 模型 | 更新日期: 2023-09-27 18:18:02
我正在编写一个小的演示应用程序(为了证明一个更大的项目的概念),它将利用c#中的被动视图MVP架构。NET 4.5)。
不涉及太多细节,它是一个应用程序,允许您使用拖放工具在大画布上绘制特定的过程(类似于Visio),然后我们基于绘制和配置的内容运行模拟。
现在,人们在我们的遗留应用程序中所做的是为流程节点设置自定义图像,因此很容易区分节点,或者使其看起来更像现实世界的情况。
像节点的位图在MVP模式中驻留在哪里?显然,坚持模型是很诱人的,但这将打破MVP模式(例如,如果我们只是有一个命令行界面呢?)将其作为视图的一部分似乎几乎与底层对象本身脱节。
另外,作为第二个小问题,对于像我所描述的那种绘画风格的应用程序,这些对象视图可能是从UserControl
或CustomControl
派生的吗?对于一些位图来说,这似乎是相当大的开销。
下面是一个非常简单的节点的例子,它作为一个非常简单的模型。通常会发生的情况是,当它的状态改变时,它看起来会不同,即应用不同的位图。
public enum NodeStates{ Idle, Working, Broken, ResourceStarved, Blocked };
public class Node: ModelBase
{
private string _username;
private NodeStates _currentState;
public Node(string username)
{
_username = username;
_currentState = NodeStates.Idle;
}
public string Username
{
get
{
return _username;
}
set
{
if (_username != value)
{
_username = value;
NotifyChanged();
}
}
}
public NodeStates CurrentState
{
get
{
return _currentState;
}
private set
{
if (_currentState != value)
{
_currentState = value;
NotifyChanged();
}
}
}
public void DoWork()
{
CurrentState = NodeStates.Working;
//Todo, schedule work complete time
}
public void WorkComplete()
{
CurrentState = NodeStates.Idle;
}
}
您关于使用位图和控制台类型应用程序的观点是有效的。然而,我认为Node的位图是Node的一个属性,应该保留在那里。
表单/控制台输出通常由具体视图处理。对于MVP的被动视图来说,这并不适合,因为你可能会通过视图界面上的特定方法或属性来分配位图。这将意味着基于控制台的视图实现将有效地忽略这一点,并且对它不做任何事情,我认为这就是您感到不安的地方。
看着监督控制器风格,问题并没有那么明显,因为你会把一个节点交给视图,然后视图会决定渲染什么,而基于控制台的视图对位图什么也不做。这实际上等同于相同的功能,但以一种更优雅的方式。
因此,我的答案是:保持位图作为节点的属性。如果使用被动视图,则具体的基于控制台的视图对位图不做任何操作。