c# - 这段代码是合适的 MVC 架构吗?

标签 c# model-view-controller design-patterns

我正在学习 MVC 模式。我创建了这个非常简单的代码作为演示。

代码的目标很简单。我创建了一个初始速度为每小时 95 英里的汽车对象。有 1 个标签显示当前速度,2 个按钮,增加和减少速度。

单击每个按钮时,速度增加或减少 1,标签显示修改后的速度。一旦速度超过 100,增加按钮将被禁用,用户现在只能降低速度。一旦速度降低到 100 以下,增加按钮将再次启用。

这是我的模型、 View 和 Controller 的代码。

接口(interface)模型

public interface IModel
{
    int getCurrentSpeed();

    int increaseSpeed();
    int decreaseSpeed();

    void updateObserver();
    void setView(IView objView);
}

carModel 类(来自 IModel 的具体类)

public class carModel : IModel
{
    private IView objLocalView;
    private int currentSpeed;

    //Constructor
    public carModel(int carSpeed)
    {
        this.currentSpeed = carSpeed;
    }

    public void setView(IView objView)
    {
        objLocalView = objView;
    }

    public int increaseSpeed()
    {
        currentSpeed++;
        updateObserver();
        return currentSpeed;
    }

    public int decreaseSpeed()
    {
        currentSpeed--;
        updateObserver();
        return currentSpeed;
    }

    public void updateObserver()
    {
        objLocalView.updateStatus(this);
    }

    public int getCurrentSpeed()
    {
        return currentSpeed;
    }

}

接口(interface) IController

public interface IController
{
    void requestIncreaseSpeed();
    void requestDecreaseSpeed();
}

carController 类(IController 的具体类)

public class carController : IController
{
    private IModel objLocalModel;
    private IView objLocalView;

    //constructor
    public carController(IModel objModel, IView objView)
    {
        objLocalView = objView;
        objLocalModel = objModel;
        objLocalModel.setView(objView);
    }

    public void requestIncreaseSpeed()
    {
        int modifiedSpeed = objLocalModel.increaseSpeed();
        checkSpeedLimit(modifiedSpeed);
    }

    public void requestDecreaseSpeed()
    {
        int modifiedSpeed = objLocalModel.decreaseSpeed();
        checkSpeedLimit(modifiedSpeed);
    }

    public void checkSpeedLimit(int modifiedSpeed)
    {
        if (modifiedSpeed > 100)
        {
            objLocalView.disableIncreaseSpeed();
        }
        else
        {
            objLocalView.enableIncreaseSpeed();
        }
    }

}

接口(interface)IView

public interface IView
{
    void enableIncreaseSpeed();
    void disableIncreaseSpeed();

    void updateStatus(IModel objModel);
}

form1.cs(用户将看到的 View 类)

public partial class Form1 : Form, IView
{
    private IModel objModel;
    private IController objController;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        objModel = new carModel(95);
        objController = new carController(objModel, this);

        updateStatus(objModel);
    }

    public void enableIncreaseSpeed()
    {
        btnIncrease.Enabled = true;
    }

    public void disableIncreaseSpeed()
    {
        btnIncrease.Enabled = false;
    }

    public void updateStatus(IModel objModel)
    {
        lblCurrentSpeed.Text = "";
        lblCurrentSpeed.Text = objModel.getCurrentSpeed().ToString();
    }

    private void btnIncrease_Click(object sender, EventArgs e)
    {
        objController.requestIncreaseSpeed();
    }

    private void btnDecrease_Click(object sender, EventArgs e)
    {
        objController.requestDecreaseSpeed();
    }
}

我不确定这是否是一个合适的 MVC 设计?因为我看不出与常规 3 层架构有什么不同(除了模型和 View 在这里通信,这在 3 层架构中不会发生)

最佳答案

由于您正在尝试实现经典 MVC,因此信息流是正确的。

唯一似乎有点不对劲的是“模型”。您假设模型是一个类。好吧……不是。模型应该是一个层,它包含了所有领域的业务逻辑。

关于c# - 这段代码是合适的 MVC 架构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11733656/

相关文章:

c# - MySql 从列中选择所有数据并计数

c# - Linq2Sql : How to handle tables with the same name and different schema names

php - 如何将模型加载到 MVC 中的 Controller 中

model-view-controller - 输入与输出的 HTML/XSS 转义

php - 方法可以返回错误或数组 - 错误的实现?

php - mvc设计问题

c# - 将位图的特定矩形绘制到另一个位图中

javascript - 在页面上显示当前月份

php - Zend Framework 如何在不同的模块中使用相同的模型?

design-patterns - 在 Clojure 的宏中声明设计模式