模型的绘图信息(坐标、图像等)在MVP模式中属于什么位置?

本文关键字:模式 MVP 属于 位置 什么 信息 绘图 坐标 图像 模型 | 更新日期: 2023-09-27 18:18:02

我正在编写一个小的演示应用程序(为了证明一个更大的项目的概念),它将利用c#中的被动视图MVP架构。NET 4.5)。

不涉及太多细节,它是一个应用程序,允许您使用拖放工具在大画布上绘制特定的过程(类似于Visio),然后我们基于绘制和配置的内容运行模拟。

现在,人们在我们的遗留应用程序中所做的是为流程节点设置自定义图像,因此很容易区分节点,或者使其看起来更像现实世界的情况。

像节点的位图在MVP模式中驻留在哪里?显然,坚持模型是很诱人的,但这将打破MVP模式(例如,如果我们只是有一个命令行界面呢?)将其作为视图的一部分似乎几乎与底层对象本身脱节。

另外,作为第二个小问题,对于像我所描述的那种绘画风格的应用程序,这些对象视图可能是从UserControlCustomControl派生的吗?对于一些位图来说,这似乎是相当大的开销。

下面是一个非常简单的节点的例子,它作为一个非常简单的模型。通常会发生的情况是,当它的状态改变时,它看起来会不同,即应用不同的位图。

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;
    }   
}

模型的绘图信息(坐标、图像等)在MVP模式中属于什么位置?

您关于使用位图和控制台类型应用程序的观点是有效的。然而,我认为Node的位图是Node的一个属性,应该保留在那里。

表单/控制台输出通常由具体视图处理。对于MVP的被动视图来说,这并不适合,因为你可能会通过视图界面上的特定方法或属性来分配位图。这将意味着基于控制台的视图实现将有效地忽略这一点,并且对它不做任何事情,我认为这就是您感到不安的地方。

看着监督控制器风格,问题并没有那么明显,因为你会把一个节点交给视图,然后视图会决定渲染什么,而基于控制台的视图对位图什么也不做。这实际上等同于相同的功能,但以一种更优雅的方式。

因此,我的答案是:保持位图作为节点的属性。如果使用被动视图,则具体的基于控制台的视图对位图不做任何操作。