
最近也许是由于假期的原因我发布的文章的速度变慢了对大家说下抱歉这个系列的确我很难写感谢大家对我的支持和关注的确我在发布后得到大家的支持和认可让我有了更多的动力之前发布的有些内容可能对各层讲解的内容的广度还不够当然这和我个人的水平面有关还请各位多多提出宝贵意见和建议。从本篇开始我将会采用更加规范的格式更严谨的求知态度更加准确的表达去将接下来的系列文章写完并且与群中的很多朋友交流后他们希望出一个总的PDF电子书这样可以方便阅读的确谢谢各位的支持我目前将以后每篇写的内容放一份PDF格式的在群共享中有需要的朋友可以进行相应的下载由于本人的写作水平有限所以在书写的深度和书写的格式上还有很多的缺点还希望大家多多指出。二、开篇本篇我们将针对系统架构分层中的表现层进行讲述分析表现层的架构与设计模式当然我们会结合目前比较流行的表现层模式进行分析讲解主要是围绕MVC模式的起源及发展的过程进行讲述并且分析目前MVC模式在不同UI层中的应用设计由于本人的水平有限加之实际的项目中可能应用的理解和经验水平不足可能在某些分析的地方不对还请大家提出。我们之前的写作惯例我们先来看看本文的主要讲述的内容吧本文将会以上面的2点为主线展开去讲解表现层的内容。三、内容提要1、前言2、内容提要3、本文提纲4、表现层模式4.1、表现层的职责4.2、UI层与表现层逻辑4.2.1、用户界面的职责4.2.2、表现层中容易产生的误区4.3、MVC模式的提出及演化4.3.1、MVC模式4.3.2、MVP模式4.3.3、MVC模式与MVP模式的对比和总结5、结束语6、系列进度7、下篇预告四、表现层模式4.1、表现层的职责我们知道任何一个应用程序如果想要更好的与客户交互我们一般都是通过提供一个用户界面去完成与用户的交互当然通过前面我们讲述的服务层与业务逻辑层的讲解其实都是为了更好的为表现层服务的通常我们都不是特别的重视表现层但是其实表现层同样重要。其实通常我们在关注各个分层的时候我们对每个分层的重视程度会不同可能是由于我们自身的爱好态度或者是专业技能所决定的但是一个好的系统必然要求我们不管哪个分层都要足够的重视。我们在做表现层时通常我们会关注下面几个组件首先是用户界面。也就是客户能够看到的用户界面简称UI还有一部分就是与用户行为进行交互的组件通常我们叫做表现层逻辑用户的所有操作都通过表现层逻辑来支持表现逻辑层将负责其他层与UI层之间的交互。根据我们前面讲述的各分层的设计我们知道表现层逻辑将主要与服务层或者业务逻辑层进行交互。具体的关系如下通过上图我们知道表现逻辑层的位置可以说如何组织好用户界面及表现层逻辑同其他层之间的关系就是决定设计好坏的关键。也可以说表现层逻辑决定了用户与系统交互。下面我们来先看看表现层的职责吧我们一般都把如下职责看作是表现层的职责是不是你也有相同的看法其实像图中说的验证格式化添加样式等这些更应该属于UI层组件而不应该属于表现层但是作为架构师你必须考虑的更全面从更高的层次去考虑比如说下面的几个方面只有更好的考虑这些因素才能决定表现层的架构我们针对上面的几个方面来简单的分析一下。1、UI的无关性这里的UI的无关性就是指不依赖UI层的实现技术不管是上面说的Web还是Winform还是其他的WPF、WP还是其他的任何UI表现形式。我们知道这样的表现层设计出来是理想的我们只是想尽可能的提高可复用性我们希望的是虽然不同的UI使用的实现技术不同但是这些UI能够共用表现层逻辑这时候我们就能做到很好的复用性。我们需要知道这里提出的代码重用只是说是尽可能大的做到表现层逻辑重用但是有些情况我们没有办法做到例如Silverlight与WPF由于他们使用不同的CLR所以我们只能说是做到代码重用我们需要针对他们各自进行单独的编译。2、可测试性任何分层都需要能够测试因为只有测试才能知道功能是否能够很好的满足需求。但是通常来说表现层的测试相比其他分层要复杂一些因为表现层需要考虑的因素很多所以决定了测试的难度所以更好的测试性就是我们架构设计的基本要求。一般来说我们在表现层的处理流程是这样的上面的图中大概描述了我们在表现层中的基本流程我们来结合图形来说明下用户界面通过用户操作将触发相应的行为事件这些事件将会被某个特殊的控制器进行处理控制器通过发送给指定的处理函数然后将处理函数返回的结果反馈给用户界面。通过上面的流程我们知道我们测试时必须模拟用户的行为并且如何保证用户的行为事件能够得到正确的处理这些都是我们必须测试的内容。我们如果将所有的内容都写在表现层那么我想可能测试起来不会那么容易如果说我们的用户界面与表现层逻辑写在一个页面中可能我们并不容易测试幸好APS.NET中通过代码后置的技术实现设计层与表现层逻辑代码的分离。当然我们在之前就对架构设计的实现提出了一个观点就是分离功能点将关注的功能点进行分离提出更高的抽象这样可以达到更好的测试的目的。3、不依赖数据模型在服务层、业务逻辑层中我们都提到了数据传输对象并且把这个对象作为与表现层通信的载体使用了数据传输对象后那么我们就可以做到表现层不依赖于我们的数据模型但是我们也讲过数据传输对象为项目带来了更多的类更多的工程文件所以这会对我们的开发工作带来额外的工作量。因为不同的表现层需要一个与之对应的数据传输对象这些都和前面我们介绍的情况是一致的。因此我们在项目中是否使用数据传输对象我们需要根据项目的需要来决定。