复合模式(Compound Pattern)之MVC模式

来源:互联网 发布:短信验证码 java 编辑:程序博客网 时间:2024/05/18 10:37

文中内容收集整理自《Head First 设计模式 中文版 》,版权归原书所有

复合模式

复合模式是由模式所构成的模式.,复合模式在一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题. 复合模式必须够一般性,适合解决许多问题才行.


MVC模式

MVC(model-view-controller) , 分别是模型-视图-控制器.

MVC是一个威力强大的复合模式,结合了观察者模式,策略模式和组合模式, 模型使用观察者模式,以便观察者更新,同时保持两者之间解耦.控制器是视图的策略, 视图可以使用不同的控制器实现,得到不同的行为.视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件. 这些模式携手合作,把MVC模型的三层解耦,这样可以保持设计干净有弹性.

模型: 模型持有所有的数据,状态和程序逻辑.模型没有注意到视图和控制器,虽然它提供了操纵和检索状态的接口,并发送状态改变通知给观察者.

视图: 用来呈现模型.视图通常直接从模型中取得它需要显示的状态与数据

控制器: 取得用户的输入并解读其对模型的意思


示意图



控制器是否能够成为模型的观察者?

当然是可以的.在某些设计中, 控制器会向模型注册,模型一有改变就通知控制器.当模型直接影响到用户界面是时,就会这么做.比方说,模型内的某些状态可以支配界面的某些项目变成有效或无效,如果这样, 要求视图更新相应显示其实就是控制器的事.


为什么不将控制器的代码放入视图,让视图直接控制模型?

不能这么做的两个原因:

1.这会让视图的代码变得更复杂,因为这样一来视图就有两个责任,不但要管理用户界面,还要处理如何控制模型的逻辑.

2. 这么做将造成模型和视图之间紧耦合,如果你想复用此视图来处理其他模型,根本不可能.控制器把逻辑从视图中分离,让模型和视图之间解耦.通过保持控制器和视图之间松耦合,设计就更有弹性而且更容易扩展,足以容纳以后的改变

控制器会实现应用逻辑吗?

不, 控制器为视图实现行为.它聪明的将来自视图的动作转成模型上的动作.模型实现应用逻辑,并决定如何响应动作.控制器也要做一些决定, 决定调用哪个模型的哪个方法,但是这不能算是"应用逻辑".应用逻辑指的是管理与操纵你的模型中的数据的代码.


MVC中的模式分析

策略模式:

视图和控制器实现了经典的策略模式:视图是一个对象,可以被调整使用不同的策略,而控制器提供了策略.视图只关心系统中可视的部分,对于任何界面行为,都委托给控制器处理.使用策略模式也可以让视图和模型之间的关系解耦,因为控制器负责和模型交互来传递用户的请求.对于工作是怎么完成的, 视图毫不知情.


观察者模式:

模型实现了观察者模式,当状态改变时,相关对象将持续更新.使用观察者模式,可以让模型完全独立于视图和控制器.同一个模型可以使用不同的视图,甚至可以同时使用多个视图.


组合模式:

视图通常使用组合模式来管理子控件, 当控制器告诉视图更新时,只需告诉视图最顶层的组件即可,组合会处理其余的事.


MVC与Web

Web开发中也经常使用MVC,使他符合浏览器/服务器模型.我们称这样的适配为"Model2",并使用Servlet和JSP技术的结合,来达到MVC的分离效果,就像传统的GUI

观察者: 视图不再是经典意义上的模型的观察者,它没有向模型注册以接收状态改变通知.但是当模型改变时, 视图的确间接地从控制器收到了相当于通知的东西.控制器甚至把Bean送给视图,这允许视图可以取得模型的状态;如果考虑到浏览器模型,视图在HTTP响应返回到浏览器时只需要一个状态信息的更新,随时的通知是没有意义的.只有当页面被创建和返回时,创建视图并结合模型状态才有意义.

策略: 在Model2中,策略对象依然是控制器Servlet,但它不像传统的做法那样直接和视图结合.就是说,策略对象为视图实现行为,当我们有不同的行为时,可以直接把控制器换掉

组合: 像Swing GUI,视图是利用许多图形组件一层一层叠起来的.但是在这里,则是由网页浏览器呈现HTML描述.尽管如此, 内部还是很类似一个形成组合的对象系统



原创粉丝点击