[Composite UI][设计模式]MVP or MVC?

简介:

********************************************************************
*                                                 版权声明
*
* 本文以Creative Commons的知识共享署名-非商业性使用-相同方式共享发布,请严格遵循该授权协议。
* 本文首发于博客园, 此声明为本文章中不可或缺的一部分。
* 作者网名:    浪子
* 作者EMAILdayichen (at)163.com
* 作者BLOG:  Http://Www.Cnblogs.Com/Walkingboy
*
********************************************************************

 

 

[Composite UI][设计模式]MVP or MVC?

-Written by 浪子@cnblogs.com  (06-12-20)

摘要:

MVP or MVC?一直以来都认为CAB是MVP的典型应用,最近再考虑自己Web MVP框架中的MdiForm实现,记得CAB.WinForms 中有类似的实现MdiWorksapce,昨天看了下CAB的所有Hands On Labs的示例,发现它的例子都不采用MVP模式,感觉有点“误用”,也顺便想了下,利用CAB做到真正的MVP的思路,暂且记录一下。

一、老调重弹:MVP与MVC

MVP不同于MVC的地方,关键在于,View不再显示的依赖于business logic controller,而是依赖于一个业务逻辑抽象接口,关注于View的解藕。

所以区分MVP与MVC的关键在于View是否依赖于某一具体的业务对象。

二、CAB Labs之MVC

暂以CAB的Labs的代码为例,各层次之间的定义和关联如下:

CustomerWorkItem:驱动一个完整的Customer UseCase

CustomerDetailView:显示客户明细的UI

CustomerDetailController:包装CustomerWorkItem的关于Detail的功能,暴露服务接口给CustomerDetailView使用

关于CustomerDetailView中如何使用CustomerWorkItem

     
     
    // We use our controller so we can show the comments page
        [CreateNew]
        public CustomerDetailController Controller
        {
            set { controller = value; }
        }

可以看到View只是依赖于OB的注入功能,采取对象注入的方式来获取Controller,但是其注入的类型却是具体的CustomerDetailController,而不是抽象对象(如IControlller),这样子虽然采用了IoC功能,但是依赖还是照样存在。

当然例子中有很多关于为View解藕的方法,比如EventBorker的Publisher和Subscriber,还有CommandHanlder,好像可以解决View的具体依赖问题,因为他们都依赖于抽象的WorkItem,但是当Controller也夹杂进来的时候,一下子就破坏了View的独立性。

三、CAB Labs之MVC重构

其实Labs中的依赖关键在于对具体Controller的依赖,如果我们可以将这部分进行重构,使之如同依赖于WorkItem一样依赖于一个IController就可以完全把View独立出来。

而如何抽象IController是关键点所在。

可能各种业务的Controller是不一样的,有的甚至背道而驰,如何抽象出他们的共同点是个难题所在。

我之前的框架是对其进行通用化,比如根据View的通过特性,定义一些跟View相关的约束:

         

    
    
public  interface IController
{
void ViewLoad;
object LoadData;
bool UpdateData;
void ViewClose;
//....
}

 

Controller以配置文件为依据,注入View中,这样子解决View的职责(收集数据,展现数据)。
但是实际编码过程中发现,这种方式摒避了业务的特性,使得编码的时候,总觉得用起来大不顺手,有点隔靴搔痒的感觉。
那如何解决业务对象千变万化的问题呢?其实CAB中已经给出了绝佳的解决方法。
首先,弱化IController的接口约束功能,接口如下:
 
 
     
     
public interface IController
{
}
没有看错,是个空接口。那业务功能怎么办?
别忘了WorkItem的实现方式,嘿嘿......
这个时候你会发现EventBroker&CommandHandler是如此的好用。通过配置将IView和IController进行结合,然后自动注册他们之间的关联Event和Command,
你会发现编码又恢复到之前面向过程的方式,但是所有的组件之间又是松耦合的。
四、CAB Labs之MVP
上节中所说的还都是MVC,只不过利用CAB将Controller的具体依赖拨除而已,此时对于重构到MVP已经是水到渠成了。
只要将控制的主动权转交到Presenter(由Controller重构而得)上就可以了。最简单的转化方式是,直接去除Labs示例中的Controller对象,
直接将WorkItem作为Presenter对象,此时所有的依赖都消失,这也是我对Labs中为何加入一个Controller的对象疑惑之处,还没有发现它的优点所在。
以上思路纯属主观幻想,框架代码重构ing......


本文转自浪子博客园博客,原文链接:http://www.cnblogs.com/walkingboy/archive/2006/12/20/CAB_MVPorMVC.html,如需转载请自行联系原作者
目录
打赏
0
0
0
0
20
分享
相关文章
MVVM、MVC、MVP三种常见软件架构设计模式的区别
MVC、MVP 和 MVVM 是三种常见的软件架构设计模式,主要通过分离关注点的方式来组织代码结构,优化开发效率。
178 12
深入理解MVC设计模式:构建高效Web应用程序的基石
【7月更文挑战第4天】在软件工程领域,设计模式是解决常见问题的一系列经过验证的方法。其中,Model-View-Controller(MVC)设计模式自诞生以来,便成为了构建用户界面,特别是Web应用程序的黄金标准。MVC通过将应用程序逻辑分离为三个核心组件,提高了代码的可维护性、可扩展性和重用性。本文将深入探讨MVC设计模式的原理,并通过一个简单的代码示例展示其应用。
273 0
MVC、MVP、MVVM 模式
MVC、MVP 和 MVVM 是三种常见的软件架构模式,用于分离用户界面和业务逻辑。MVC(Model-View-Controller)通过模型、视图和控制器分离数据、界面和控制逻辑;MVP(Model-View-Presenter)将控制逻辑移到 Presenter 中,减少视图的负担;MVVM(Model-View-ViewModel)通过数据绑定机制进一步解耦视图和模型,提高代码的可维护性和测试性。
MVC革命:如何用一个设计模式重塑你的应用架构,让代码重构变得戏剧性地简单!
【8月更文挑战第22天】自定义MVC(Model-View-Controller)设计模式将应用分为模型、视图和控制器三个核心组件,实现关注点分离,提升代码可维护性和扩展性。模型管理数据和业务逻辑,视图负责数据显示与用户交互,控制器处理用户输入并协调模型与视图。通过示例代码展示了基本的MVC框架实现,可根据需求扩展定制。MVC模式灵活性强,支持单元测试与多人协作,但需注意避免控制器过度复杂化。
68 1
Flutter UI设计模式与实现:深入探索与实践
【7月更文挑战第20天】Flutter以其独特的声明式UI模式和丰富的UI组件库,为移动应用开发提供了强大的支持。通过深入理解Flutter的UI设计模式和实现技巧,开发者可以构建出高性能、可维护性强的UI界面。同时,随着Flutter生态的不断完善和发展,相信未来Flutter将在移动应用开发领域发挥更加重要的作用。
对抗软件复杂度问题之组合(Composite)方法设计模式是什么,如何解决
对抗软件复杂度问题之组合(Composite)方法设计模式是什么,如何解决
【设计模式】MVC与MVVM详尽解读与实战指南
【设计模式】MVC与MVVM详尽解读与实战指南
1145 0
19:Web开发模式与MVC设计模式-Java Web
19:Web开发模式与MVC设计模式-Java Web
160 4
安卓架构模式:MVC、MVP、MVVM及更多
【4月更文挑战第13天】本文探讨了安卓应用开发中的常见架构模式,包括MVC、MVP和MVVM,以及VIPER和Clean Architecture。MVC分离关注点,易于理解,但安卓不直接支持。MVP通过呈现器实现更清晰的分层和便于单元测试。MVVM利用数据绑定简化UI逻辑,适合声明式编程。开发者应根据项目需求、团队技能和维护周期选择合适架构,随着工具和框架的进步,未来将提供更多模块化、可测试性和敏捷性的解决方案。
354 7
Java的mvc设计模式在web开发中应用
Java的mvc设计模式在web开发中应用
166 0

热门文章

最新文章

  • 1
    Flame:开源AI设计图转代码模型!生成React组件,精准还原UI+动态交互效果
    155
  • 2
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    8
  • 3
    Magma:微软放大招!新型多模态AI能看懂视频+浏览网页+UI交互+控制机器人,数字世界到物理现实无缝衔接
    19
  • 4
    【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
    8
  • 5
    如何在React.js中使用Shadcn/UI
    7
  • 6
    unity判断鼠标在不在UI上
    4
  • 7
    FirstUI:Deepseek能帮我们做很多事情,而这款开源框架专为开发者设计的开源UI框架,让你的项目加速起飞
    19
  • 8
    Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)
    11
  • 9
    【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
    5
  • 10
    WEB CAD插件通过上下文对象MxPluginContext修改UI界面的方法
    8