模型视图控制器设计模式代码示例

2024-01-19

我正在研究模型-视图-控制器设计模式,并且从理论上理解了该模式背后的概念,但我想了解一下人们如何实际将其付诸实践。
维基百科提到了 Wt - Web 工具包、CppCMS 和其他一些使用该模式的标准实现,但是我对这些并不熟悉,我只是希望和 如果有人可以提供一些示例代码(希望是 C++)来实现该模式并解释该模式付诸实践的理论,我将非常感激。


这是我制作的一个简单示例(没有尝试编译它,如果有错误请告诉我):

class Button; // Prewritten GUI element

class GraphGUI {
public:
    GraphGUI() {
        _button = new Button("Click Me");
        _model = new GraphData();
        _controller = new GraphController(_model, _button);
    }
    ~GraphGUI() {
        delete _button;
        delete _model;
        delete _controller;
    }

    drawGraph() {
        // Use model's data to draw the graph somehow
    }
    ...

private:
    Button*              _button;
    GraphData*           _model;
    GraphController*     _controller;
};

class GraphData {
public:
    GraphData() {
        _number = 10; 
    }
    void increaseNumber() {
        _number += 10;
    }
    const int getNumber() { return _number; }
private:
    int _number;
};

class GraphController {
public:
    GraphController(GraphData* model, Button* button) {
        __model = model;
        __button = button;
        __button->setClickHandler(this, &onButtonClicked);
    }

    void onButtonClicked() {
        __model->increaseNumber();
    }

private:
    // Don't handle memory
    GraphData*    __model;
    Button*       __button; 
};

忽略 Button 的实现,基本上这个程序将使用 GraphGUI 来显示按下按钮时会发生变化的图形。假设它是一个条形图,它会变得更高。

由于模型独立于视图(按钮),并且控制器处理两者之间的通信,因此这遵循 MVC 模式。

单击按钮时,控制器通过 onButtonClicked 函数修改模型,Button 类知道在单击按钮时调用该函数。

这样做的好处是,由于模型和视图是完全独立的,每个模型的实现都可以发生巨大的变化,并且不会影响另一个模型,控制器可能只需要进行一些更改。如果本例中的模型根据某些数据库数据计算出某些结果,则单击按钮可能会导致这种情况发生,但按钮实现不必更改。或者,当鼠标悬停在按钮上时,它可以告诉控制器,而不是告诉控制器何时发生单击。无论是什么触发了更改,相同的更改都会应用于模型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模型视图控制器设计模式代码示例 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 为什么我要使用责任链而不是 switch 语句

    考虑一下您已经获得了多次验证 仅当要检查的对象属于某种类型时 这些验证才应生效 为什么我要使用责任链而不是 switch 语句 责任链示例 public class Executor Inject private ValidatorFact
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • openERP(odoo)中的继承

    我是 openERP 的新手 正在接受面试 请解释一下openERP中不同类型继承的想法 我认为总共有3种类型 请从面试的角度 用非常简单的方式解释一下 P S 我熟悉简单继承的概念 继承 继承机制用于创建可重用性的思想 可重用性意味着在任
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐

  • 如何在托管 C++ 中捕获非托管 C++ 异常

    我正在一个大型非托管 C 库和一个大型 C 库上开发一个瘦托管 C 包装器 我需要捕获源自该大型非托管 C 库的错误 并将它们作为 Clr 异常重新抛出 非托管库抛出以下类的实例 Error Error const std string f
  • C# Treeview 移动节点后不刷新

    在我的 Windows 应用程序中 我有一个树视图 我制作了自定义按钮来向下移动节点 单击按钮时会发生以下情况 Node destNode tvCategories SelectedNode NextNode Node srcNode tv
  • 我需要帮助才能在同步模式下进行 FB.api() 调用

    我在 for 循环中运行 FB api 时遇到问题 for var i 0 i lt commentObjectLength i var fbFeedID commentObject OwnCommentList i fbFeedID va
  • 基于机架的 Web 服务器是否代表 FastCGI 协议?

    我读到 CGI FastCGI 是一种用于将外部应用程序连接到 Web 服务器的协议 因此 Web 服务器 如 Apache 或 NginX 通过套接字将环境信息和页面请求本身发送到 FastCGI 进程 并且 FastCGI 通过同一连接
  • ng-repeat 定义的次数而不是在数组上重复的方法?

    有没有办法ng repeat定义的次数而不是总是必须迭代数组 例如 下面我希望列表项显示 5 次 假设 scope number等于 5 并增加数字 因此每个列表项都会增加 1 2 3 4 5 期望的结果 ul li span 1 span
  • 从 Python 快速导入自定义 SPSS 命令

    我编写了一个简洁的 Python 模块 其中包含一些自定义 SPSS 函数供我的同事使用 但是 要使用该功能 他们首先需要输入 BEGIN PROGRAM 在实际调用函数之前导入模块等 因为他们中的大多数人并不精通技术 所以我希望让事情变得
  • TextBox.TextAlign右对齐在某些情况下没有效果?

    我的 Visual C Express 2010 表单应用程序中有一个路径选择器 我用的是FolderBrowserDialog和一个 单行 TextBox 显示所选路径 在我的 UI 刷新代码中使用以下行 this textBoxFold
  • 在 Flutter 中,Getx 包unknownRoute 不起作用

    我开始在 flutter 中学习 Getx 并使用导航 我想设置unknownRoute 以防命名路由中存在拼写错误等 因此应用程序应该转到默认页面 我确实喜欢这样 return GetMaterialApp title Named nav
  • 如何在 Scala 中获取 Ponter/Reference 语义

    在 C 中 我只需要一个指向 arr idx 的指针 或引用 在 Scala 中 我发现自己创建这个类来模拟指针语义 class SetTo val arr Array Double val idx Int def apply d Doub
  • git 过滤器不是“取消修改”文件

    我正在使用一个 IDE 它在一些已生成但强烈需要的库文件中生成一个版本 因此 如果我想使用具有多个版本的库 或者我看到大量实际上毫无意义的更改 就会出现问题 Summary 我想忽略一个single一个或多个文件的行 我认为 git 的过滤
  • 如何制作用于api调用的通用改造库

    我正在研究 API 集成 我想为 API 集成创建通用类 它可以适应所有 API 集成 现在我对所有 API 使用单独的代码 我是 Android 应用程序开发的新手 所以请指导我 public void getHomeCategoryDe
  • C++ 类型“char*”和“const char [2]”到二进制“operator+”的无效操作数

    当尝试执行以下简单代码时 编译器返回错误 类型 char 和 const char 2 到二进制 operator 的无效操作数 BodyText client PS3 ReadString 0x0178646c n 这是我的 ReadSt
  • 为什么我在 matplotlib 中的绘图不显示轴

    我的绘图遇到了麻烦 因为当我处理它时 轴标签似乎显示在 Jupyter Notebooks 中 但是 当我将文件导出到 py 文件并在终端中运行它时 给出的图表没有轴标签 fig plt figure figsize 15 5 ax fig
  • Kotlin 类转换异常

    我是 Android 开发新手 我在教程中看到了这段代码 class MainActivity AppCompatActivity private val newNumber by lazy LazyThreadSafetyMode NON
  • BCP 导入错误“强制转换规范的字符值无效”

    全部 我使用 BCP 进行导入导出 并在尝试导入回来时仅 1 导出的第一行 行出现 强制转换规范的字符值无效 错误 表结构 Col1 数字 19 0 第 2 列 NVARCHAR 400 Col3 NVARCHAR 400 我正在使用以下命
  • 在动画中切换位置属性上的 CABasicAnimation 会导致闪烁

    我有一些代码使用 CALayers 使气泡从下到上流动 如果用户触摸屏幕 我会编写一些代码 将当前正在运行的动画替换为具有手指触摸的 toPoint 的动画 当动画切换时 它会导致设备上 而不是模拟器上 闪烁 任何有关消除闪烁的提示将不胜感
  • 获取html文件的最后修改日期

    在导入到我的网络应用程序中时 如何找出 html 文件的最后修改日期 html 文件位于另一台服务器上 不同的用户可以进行更新 当我检索页面时 我希望能够看到它的上次更新时间 以便我可以在主页上标记更新日期 我 我假设您正在使用 HTTP
  • “定义”数组元素的计数

    给定以下数组 var arr undefined undefined 2 5 undefined undefined 我想得到元素的数量are定义 即 那些是not undefined 除了循环遍历数组之外 还有什么好的方法吗 在最近的浏览
  • 为 Mac 版 docker 指定 IP 地址

    我在用着Mac 版 Docker 测试版它远离聚光灯 有什么方法可以从控制台运行它或强制使用任何配置文件来指定 docker 主机的 IP 地址 现在它从 192 168 64 3 更改为 192 168 64 5 每次启动 docker
  • 模型视图控制器设计模式代码示例

    我正在研究模型 视图 控制器设计模式 并且从理论上理解了该模式背后的概念 但我想了解一下人们如何实际将其付诸实践 维基百科提到了 Wt Web 工具包 CppCMS 和其他一些使用该模式的标准实现 但是我对这些并不熟悉 我只是希望和 如果有