小米一面:说说MVC和设计模式的关系
前言先来看看面试环节吧。面试官请说说MVC模式是基于哪种设计模式的求职者MVC本身不就是一种设计模式吗面试官我的意思是MVC是基于23中设计模式中的哪一种求职者难道MVC不是那23种当中的面试官…………好吧这种情况下大概率是求职者对设计模式的学习比较少就连我这种没正经学过设计模式的混子也知道23种设计模式当中没有MVC。回归正题其实MVC模式是基于观察者模式的你仔细想想MVC中的Model其实对应的是观察者模式的被观察对象也叫主题或目标而View则对应的则是观察者的角色。如果你想不清楚的话就继续往下看吧我带你分析一波。MVC模式MVC 模式代表 Model-View-Controller模型-视图-控制器 模式。模型Model负责管理应用程序的数据和业务逻辑。视图View显示模型的数据通常是用户界面元素。控制器Controller控制器作用于模型和视图上它控制数据流向模型对象并在数据变化时更新视图使视图与模型分离开。这种模式的目的是实现动态的程序设计简化对程序的修改和扩展并使程序某一部分的重复利用成为可能。通过将信息的内部表示与信息的呈现方式分离使得组件具有较好的重用性。例如同一个程序可以使用不同的表现形式来展示相同的数据比如一批统计数据可以分别用柱状图、条形图来表示。MVC模式示例图应用场景几乎每一个 Web 项目都会使用到 MVC 模式所以有许多的框架都对此做了集成和封装的工作像我们 Java 程序员最常见的就是平时使用的 SpringMVC 框架了。dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version5.0.1.RELEASE/version /dependency当然现在的 Web 项目中一般只有 Controller 和 Model 并不存在所谓的 View那是因为目前流行的前后端分离开发模式已经将 View 交给前端程序员去做了。早些年的 Java 程序员会写一种叫jsp的东西就算你没写过也多少听说过吧。这玩意就是用来展示页面的也就是 MVC 中的 View 。那时候的项目结构是这样子的比现在的结构多了个web文件夹里面就包含了View层的代码index.jsp而 jsp 的代码呢长这样% page contentTypetext/html;charsetUTF-8 languagejava % html head title$Title$/title /head body % System.out.println(hello jsp); % /body /html眼熟不其实就是 HTML 和 Java 的结合写法最终返回给浏览器的就是一个 HTML 页面。即使现在后端程序员不再写 View 层了但其实大家的开发思路还是和原来一致的只是把 View 交给了前端程序员去实现。除了SpringMVC服务端的MVC框架还有Struts、ASP.Net MVC前端的MVC框架还有angularjs、reactjs等。观察者模式前面已经说了MVC模式就是基于观察者模式的所以我也不绕弯子直接给大家介绍一下这个观察者模式。观察者模式是我们常说的23种设计模式中的一种它定义了对象之间的依赖关系使得当一个对象的状态发生改变时所有依赖于它的对象都会得到通知并自动更新。观察者模式中包含4个角色目标Subject也称为主题它是指被观察的对象。目标中定义了一个观察者的集合一个目标可以接受任意数量的观察者同时也提供了一些方法例如添加观察者 add() 、删除观察者 delete() 、通知所有观察者 notify() 等。目标类可以是抽象类、具体类或者接口。具体目标ConcreteSubject具体目标是目标的子类或实现类通常包含有经常发生改变的数据当它的状态发生变化时会向所有的观察者发出通知。如果无需扩展目标类那具体目标类可以省略。观察者Observer观察者将对目标的改变做出反应观察者一般定义为接口或抽象类接口中声明更新数据的方法 update()。具体观察者ConcreteObserver具体观察者实现了抽象观察者的 update() 方法并且会维护一个指向具体目标的引用。当收到观察者的通知开始执行 update() 方法时会根据观察者的状态来执行对应的逻辑。下面是我画的结构图观察者模式结构图形象一点的话就是好了差不多就是这样。纸上谈兵终觉浅看看应用场景可能会更好理解。应用场景熟悉消息队列的同学应该对发布/订阅模式有一点了解就是生产者发送消息到队列中然后订阅这个队列的所有消费者都会收到这条消息简单易懂其实 发布/订阅模式 也是观察者模式的一种变体。另外JDK对观察者模式也有支持开发者可以直接使用Observer接口和Observable类来作为观察者模式的抽象层再自定义具体的观察者类和具体观察目标类这样可以更方便的在Java中应用观察者模式。MVC与观察者模式的关系在MVC架构中模型是观察者模式的主题视图是观察者。当模型的状态发生改变时视图会自动更新反映模型的新状态。让我们回到前面的这张MVC结构图MVC模式示例图在这张图中Model层提供的数据是View层所观察的对象在View层中包含了两个用于显示数据的图表如果Model层中的数据发生改变那这两个图表的展示也会随之改变有可能得刷新一下所以说MVC中也应用了观察者模式的思想。