有朋友谈到三层与MVC的区别以前也有人抛出这个问题本人对来公司面试的朋友也偶乐会提这方面的问题 那么我也来讲讲我对这两者的理解吧 首先对这个题目本身是存在问题的XX结构与XX模式的区别?请问中国社会制度与美国人生活方式有什么区别? 这两者本身讲的是不同方向与角度的问题在实际应用中他们的确存在一些相似的特点在很多书籍中也没有深入讲解以致于造成困惑为了更好的理解他们姑且来说说区别吧 首先N层结构是一种软件抽象的层次结构是对复杂软件的一种纵向切分每一层次中完成同一类型的操作以便将各种代码以其完成的使命作为依据来分割以将低软件的复杂度提高其可维护性一般来说层次之间是向下依赖的下层代码未确定其接口(契约)前上层代码是无法开发的下层代码接口(契约)的变化将使上层的代码一起变化三层结构是N层结构的一种是人产在长时间使用中得出来的一种应用场合广泛的N层结构被当作一种典型的软件层次结构而广为流传甚至写入教科书 MVC模式是一种复合设计模式一种在特定场合用于解决某种实际问题来得出的可以反复实践的解决方案巧合的是他也有三个事物组成于是乎人们就有了一种想当然的对应关系展示层View业务逻辑层Control持久层Model首先MVC中的三个事物之间并不存在明显的层次结构没有明显的向下依赖关系相反的View和Model往往是比较独立的而Control是连接两者的桥梁他们更像是横向的切分这样一来就出现一个结果MVC中每个块都是可以独立测试的而三层结构中上层模块的运行测试势必要提供下层代码或者提供相同接口的桩相对来说MVC复杂得多但是结构更清晰耦合性更低 另外MVC中每一块内部特别是Model内部经常被设计为多层的在我认为的一个良好的MVC模式构建的结构中Control是核心小且较为稳定的可以作为一个核心框架来提供有扩展点但基本上可以简单配置不需要任何代码就可以运行而View则可能是一套或多种可选择的视图引擎决定了软件展示给用于的界面使用时的主要工作量在于扩展点以及根据需要而数量不同的视图模板Model则是业务提供者决定了软件提供的功能其内部可能是一些普通的类或者是实现了某些接口的类在这一块当中可能根据业务的不同而色彩缤纷对于复杂的软件可能会分成很多层如业务逻辑层业务提供层系统提供层数据提供层数据访问层等 我经常用于比喻MVC的例子是小时候玩的那种卡带式游戏机Control是主机一般来说我买一个主机就行了只要他不坏他就能一直让我玩这一类的游戏View则是电视机和游戏手柄电视机可以独立工作他不管输入的是电视信号影碟机信号还是游戏机信号他只管显示而且他决定了我们看到的效果是怎么样的如果我想要个尺寸更大的或者彩色的显示效果我只需要买个相应的电视机就行了手柄也是可以换的要遥桿还是带震动的Model则是游戏卡带他绝定了我玩的是什么游戏是魂斗罗还是超级玛莉而且游戏机主机和电视机生产厂家永远也不知道在上面有可能会运行什么样的游戏卡带中可能会有游戏代码和存储单元都根据游戏的需要而设计 有朋友提到游戏主机提供的卡带插槽的接口在设计中有时也由Control提供一组接口以用于Model或View的实现这样就形成了依赖一般来说这样设计也没有太大的问题只是会提高模块间的耦合度也会带来一些侵入性为了更完美可以不用接口来提供契约可以用配置信息(或称元数据信息)+反射来提供契约那么这个类接口就可以退化到只要符合CLS就可以了也就是普通的类就像现在的计算机接口广泛采用USB无论是U盘打印机扫描仪或者是加密狗他们都是普通的USB设备而已 提到USB有一个题外话模块的可插拔性设计甚至是热插拔设计系统可以在不停止运行的情况下动态的挂载或移除模块动态挂载模块需要系统能够自动发现新模块并根据自描述的信息进行自动配置移除可能情况更复杂一点需要安全删除硬件类似的功能 在设计广泛重用的框架时会考虑多种情况以达到更大的适应性一般项目中应用MVC模式可以较为随意 |