MVC控制器(Controller)与策略模式(Strategy)

2023-10-27

MVC控制器(Controller)与策略模式(Strategy)

 

转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd

作者联系方式:Li XianJing <xianjimli at hotmail dot com>

更新时间:2006-1-11

 

MVC模式已经称得上是家喻户晓了,MVC是模型(Model)、视图(View)和控制器(Controller)的首字母缩写。与模型(Model)和视图(View)相比,控制器(Controller)的功能要小得多。正因为它太简单了,MFC甚至把MVC模式简化成文档(Doc)/视图(View) 模式,控制器(Controller)几乎是个透明人,很少有人提及它。

 

在典型的GUI应用程序中,控制器(Controller)就是事件处理函数,它仅仅是把模型(Model)和视图(View),或者视图(View)与视图(View)关联起来,一个简单的胶合层而已,如果MVC模型应用得好,控制器(Controller)只有少量的代码,所以常常被人忽视。

 

在《企业应用架构模式》中,Fowler先生说过,视图和控制器的分离,就不那么重要了。实际上,几乎Smalltalk的每个版本都没有让视图和控制器的实现分离。为什么你会想分离它们呢,经典的例子是支持可编辑和不可编辑的行为。可以在这两种情况下,用一个视图和两个控制器的实现,这里控制器是视图的策略(strateies)。…

 

可编辑和不可编辑的行为,主要是针对编辑器控制而言的,如果是针对整个窗口,完全没有必要,直接把窗口上各个编辑器设为只读的就行了。真正去写编辑器的机会并不多,在其它地方,用策略模式(strategy)来配置控制器(Controller)的机会更少。我也从来没有关注过控制器(Controller)。这几天在重构短信应用程序时,我发现有时在控制器(Controller)上还真有文章可作。

 

在我们的平台上,短信应用程序是邮件系统的一个子系统,完整的邮件系统包括短信、彩信和邮件三个子系统。每一个子系统都是一个插件,这样保证了三者的独立性,以便于裁减。短信应用程序基本功能已经可用了,下一步任务是设计彩信应用的架构和编写主要代码,我发现短信和彩信有很共通之处,决定对短信应用程序进行重构。

 

经过讨论,我们发现彩信和邮件的数据表完全可以统一起来,主要字段(field)有发件人、收件人、收/发时间、主题、状态和附件等等,而短信看似特殊一点,在仔细分析后,可以发现也就多了一个附件而已。当彩信和邮件没有附件时,它们与短信差不多一样,最后我们决定把三者统一起来,放在一张表中。它们的操作也差不多,于是把短信的模型(Model)改成一个通用的模型,在三者间共享。

 

短信、彩信和邮件的模型部分统一了,缩减了不少的代码。三者的编写和阅读界面差异很大,统一起来的可能性太小,不做统一的考虑了。但是列表界面则完全一样,该界面上的操作无非是删除、删除全部、查看、编写、回复、转发和设置等等,由于模型(Model)是统一的,删除和删除全部等处理完全一样,而查看、编写、回复、转发和设置等,不同的子系统处理不一样,要在控制器(Controller)中调用不同的函数。

 

列表界面的代码量并不大,但重复三次可不太爽。我决定重用这个视图,用策略(strateies)来配置控制器(Controller),控制器(Controller)定义了查看、编写、回复、转发和设置等几个接口函数,其实现也很容易,可以直接指向各个子系统的相关函数。其结构如下图所示:

 

重构之后,处理简化了,几乎没有重复代码,维护更容易。此外还有一个好处是,动态切换子系统速度更快,界面无闪烁。尽管这次重构对短信应用程序的架构做了很大调整,花了好几天时间,但我认为这是值得的。

 

~~end~~

 

 

 

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

MVC控制器(Controller)与策略模式(Strategy) 的相关文章

  • 如何正确捕获 Aero/DWM 上的特定窗口

    背景资料 我编写了这个 MFC 应用程序并使用了很长时间 当用户按下 Print Screen Alt Print Screen 键时 它几乎会自动将屏幕截图保存到硬盘 我一直推迟使用任何与 Aero 相关的东西 直到现在我已经使用 Win
  • 如何从头开始启动 MFC 应用程序?

    换句话说 来自一个空白的 win32 项目 无向导 这就是我所在的地方 预处理器定义 WIN32 链接器 gt 系统 gt 子系统 控制台 int tmain int nRetCode 0 initialize MFC and print
  • 如何显示非模式对话框并立即在其中显示信息?

    我想在屏幕上显示一个无模式对话框并在其中显示一些信息 但是 如果我按照以下方式使用它 则会出现一些问题 function showdialog XXX heavy work update the dialog heavy work upda
  • 如何向现有 Win32 C++ 项目添加 MFC 支持?

    我正在创建一个 C 应用程序 它使用 Qt 创建 GUI 但是 我需要使用依赖于 MFC 的第三方库 用于 CString 等 无论如何 是否可以将 MFC 添加到我的应用程序中以允许我使用这个库 或者我需要自己重写它 I saw 这个问题
  • 升级后的 MFC 应用程序看起来仍然很旧

    我有一个用 VC6 编写的 MFC 应用程序 我已将其升级到 VS2015 并且它可以构建并运行 该应用程序是一个主可执行文件 其中包含许多包含对话框的 DLL 然而应用仍然looks就像用 VC6 构建的一样 所有 GUI 组件都没有 W
  • 将简单的 MFC CView/CDocument/CSingleDocTemplate 应用程序转换为 ActiveX 控件

    我有一个相当简单的 MFC 应用程序 它只定义了自己的子类CDocument CView and CFrameWnd并通过使用它们CSingleDocTemplate在视图的树中显示文档的只读内容 都是非常标准的MFC MVC 我现在需要转
  • 使用 CSplitterWnd 在 CChildFrame 中创建多个视图

    我正在使用 MFC MDI 我需要创建如下视图 我的 ChildWnd 分为两部分 它们是LeftView CView 和RightView CScrollView LeftView 分为两部分 TreeView 和 FormView 我怎
  • Smalltalk:原语是如何实现的?

    我知道一切都是对象 您可以向 Smalltalk 中的对象发送消息来执行几乎所有操作 现在我们如何实现一个对象 内存表示和基本操作 来表示原始数据类型 例如如何 对于整数的实现 我查看了 Smalltalk 的源代码并发现了这个Smalli
  • 与 UltraHD 兼容的 CHtmlView

    CHtmlView与 UltraHD 分辨率不兼容 实现 UltraHD 感知并不仅仅在于使用正确的 HTML CSS 打印预览机制失败并裁剪页面 许多个月前 微软承认这是一个问题 但没有解决它 我的应用程序大量使用CHtmlView用于显
  • 解释一下Smalltalk的一段代码?

    我无法理解这段 Smalltalk 代码 line self upTo Character cr size 0 whileTrue 有人可以帮忙解释一下吗 如果您有代码来源的映像 可以做的一件简单的事情就是在其上运行调试器并单步执行 如果您
  • 如何找到激活时打开给定 HMENU 的菜单项(如果有)?

    我想用原型实现一个功能 Locates the menu item of the application which caused the given menu mnu to show up return true if the given
  • 基于 C# .NET 文档的应用程序操作图

    我想开发一个新的应用程序 用户可以在其中创建描述流程的图表 我认为在这种情况下 基于文档的应用程序是我唯一的选择 我熟悉C net C MFC 和J2EE 根据您的经验 实现这一目标的最佳方法是什么 我应该关注哪个平台 图表必须由方框和箭头
  • MFC 是否提供了将文本放入剪贴板的快速方法?

    我们的代码库中的添加到剪贴板代码非常低级 分配全局内存等等 对于简单的情况 我只想将一些纯文本放在剪贴板上 是否有任何例程可以包装所有这些内容 一个例子是 CRichEditCtrl 具有 Copy 和 Cut 方法 可以自动将当前选择放入
  • 如何停止对辅助隐式加载 DLL 的 DLL 劫持

    例如 COMDLG32 DLL 隐式链接到以下系统 DLL 以及其他 xmllite dll dll srvcli dll wkscli dll 链接信息库 netutils dll 微星 dll 由于这些是由操作系统隐式加载的 而不是使用
  • 如何将命名管道字符串从非托管代码空间发送到托管代码空间?

    我似乎遇到了命名管道 101 问题 我有一个非常简单的设置来连接从 C 非托管应用程序传输到 C 托管应用程序的单工命名管道 管道已连接 但我无法通过管道发送 消息 除非我关闭似乎刷新缓冲区并传递消息的句柄 就好像消息被屏蔽了一样 我尝试颠
  • 想要将 ColeDateTime 转换为 CTime

    我正在从数据库中读取日期时间ColeDateTime格式 我想将其转换为CTime获取日期 月份 年份和时间 CString repDt this will hold the datetime which i read from Datab
  • 具有键唯一性和按位置排序的 MFC 字典集合

    看着表上http msdn microsoft com en us library y1z022s1 28v vs 80 29 aspx core collection shape features http msdn microsoft
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • MFC 中位图背景绘制的线程类型

    我有一个 MFC 文档 视图 C 图形应用程序 它将所有绘图都绘制到离屏位图 然后将其复制到 OnDraw 方法中提供的 CDC 指针 在过去的几天里 我一直在寻找将绘图组件放置在单独的工作线程中 这样它就不会停止 GUI 当我执行此操作时
  • C++ 中的转换错误

    有人可以帮我解决这个错误吗 我是 C 新手 看来错误就发生在一堆宏中 我能做什么来解决它 或者我怎样才能追踪到它的源头 我真的不明白这个错误 这是否意味着编译器尝试转换该方法void ReadCPUparameter to a LRESUL

随机推荐

  • 关键帧动画html例子,关键帧

    关键帧 keyframes 在CSS中 keyframes根据你定义的样式规则来更有效的控制动画队列中的每一个中间步骤 或者每一个路径点 用 keyframes来制定动画规则会比使用transition 过渡 来获得更细腻更全面的动画效果
  • 【姿态估计】

    https arxiv org pdf 1910 06278 pdf 关键点标签编码 encoding 训练人体姿态估计网络时 考虑到训练代价 通常会将将输入图片做降采样 在降采样后的分辨率上进行训练 为了网络能够以热度图为标签进行训练 需
  • 【深度学习】一分钟速学

    非极大抑制 NMS的英文是Non maximum suppression的缩写 简单的说 就是模型给出了多个重叠在一起的候选框 我们只需要保留一个就可以了 其他的重叠的候选框就删掉了 效果可见下图 交并比 IoU的英文全称Interp ov
  • 超详细

    早在去年的十二月份 也就是2020年12月 CentOS 官方发文宣称 CentOS项目的未来是 CentOS Stream 明年我们会将重点从CentOS Linux 转移到CentOS Stream 它紧随当前 RHEL 版本之前 Ce
  • matlab和stata,Stata和Matlab联合处理金融数据

    Stata是统计学专业软件 可以很方便的对数据处理 但几乎只能按照整行整列进行 而且每次只能加载一个矩阵 dta文件 如果要用到多个矩阵数据进行操作或进行复杂的循环控制 就力不从心了 而Matlab工业界广泛使用的数据分析处理工具 对矩阵支
  • 在eclipse中调试时,怎样查看一个变量的值?

    在要查看的变量前先设置断点 然后选中变量 右键选debug as gt Java Application 打开debug 透视图 这时在Variables 窗口中可以看到变量当前的值 如果是局部变量 也可以在局部变量窗口中查看 要知道一个方
  • Redis系列一

    1 1 Nosql 1 1 1 概述 单机mysql时代 90年代 一个基本的网站访问量不会太大 单个数据库足够 更多的使用静态网页html 网站瓶颈 数据量太大 一个机器放不下 数据的索引 一个机器的内存也放不下 访问量太大 读写混合 性
  • 病毒分析系列2

    前言 接上篇 进行病毒分析时 在进行具体的病毒行为分析前 需要或许可疑文件的基本信息 此时可以使用pe工具进行分析和获取 基本静态信息获取 一般需要获取的信息包括但不限于 程序哈希值 导入函数表 导出函数表 是否有壳 程序的位数 字符串 具
  • excel中如何将3'30"格式的分秒转换成以秒为单位的数字?

    在excel中 如记录比赛成绩的格式为3 30 要转换成以秒为单位的数字 如210秒的方式 请问该如何操作 假设你的数据在A列 A1 A100 在B1输入下面的公式 然后向下填充 TEXT 00 SUBSTITUTE LEFT A1 LEN
  • 科普篇

    开发者是开源社区生生不息的源动力 为了汇聚开发者力量 共建开源生态 FISCO BCOS智能合约编译技术专项兴趣小组 Compiling Technology of Smart Contract Special Interest Group
  • 链游

    一 前言 身为一名从事移动互联网App开发多年的从业人员 一直在关注前沿的技术方向 以免被时代的列车遗落 从18年底开始关注DApp技术的发展 COCOS发起的COCOS BCX以区块链为底层技术 专注区块链游戏领域的DApp游戏开发框架自
  • 【半监督学习】4、Dense Teacher

    文章目录 一 背景 二 方法 2 1 框架结构 2 2 伪标签的缺陷 2 3 Dense Peseudo Label 三 效果 3 1 数据和实验设置 3 2 主要的结果对比 3 3 和 SOTA 的对比 论文 Dense Teacher
  • yarn upgrade 更新依赖包时yarn.lock更新但package.json不同步更新版本信息

    背景 独立维护项目的架构与开发工作 在升级依赖包时发现使用yarn upgrade更新依赖包 yarn lock文件更新了 但是package json里依赖包的版本没有更新 解决方案 下载npm check updates yarn up
  • 完美解决Python各种no module named "XX"问题

    在腾讯云上玩Django 但总是遇到no module name django core wsgi 等问题 在django的 error log中也提示是 no module 但是 本地 python3 wsgi py或者 python3
  • 被 GitHub 「临时邮箱」项目拉黑,Firefox Relay 引热议;业内首个开源容器安全平台发布;Deepin 20.4 发布

    整理 宋彤彤 责编 屠敏 开源吞噬世界的趋势下 借助开源软件 基于开源协议 任何人都可以得到项目的源代码 加以学习 修改 甚至是重新分发 关注 开源日报 一文速览国内外今日的开源大事件吧 一分钟速览新闻点 开源大新闻 SUSE 发布业内首个
  • IE8兼容

    X UA Compatible是针对ie8新加的一个设置 对于ie8之外的浏览器是不识别的 这个区别与 content IE 7 在无论页面是否包含指令 都像是使用了 Windows Internet Explorer 7的标准模式 而co
  • 大话赛宁云

    如今 随着数字时代的飞速发展 安全漏洞存在于网络空间中 对系统造成极大的安全隐患 为网络攻击者的恶意入侵提供了捷径 对此 解决这一困境 要秉承 快速 自动 安全 的解决标准 首先需要高技术手段的支持 实施常态化演练 及时发现安全漏洞 测评危
  • 【计算机视觉

    文章目录 一 检测相关 8篇 1 1 Attending Generalizability in Course of Deep Fake Detection by Exploring Multi task Learning 1 2 Harv
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • MVC控制器(Controller)与策略模式(Strategy)

    MVC控制器 Controller 与策略模式 Strategy 转载时请注明出处和作者联系方式 http blog csdn net absurd 作者联系方式 Li XianJing