MVC模式ppt课件_第1页
MVC模式ppt课件_第2页
MVC模式ppt课件_第3页
MVC模式ppt课件_第4页
MVC模式ppt课件_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MVC体系结构模式,1,MVC体系结构模式,教学目标: 掌握MVC模式的概念 熟练掌握MVC模式的语境、问题与解决方案 掌握MVC模式的结构与实现 教学重点: 掌握MVC模式的概念及其语境、问题与解决方案 教学难点: 熟练掌握MVC模式的语境、问题与解决方案,2,交互式系统,系统与用户的交互:主要通过GUI 目的:增强可用性 主要挑战:保持功能内核独立于用户接口 UI的易变性:“式样和感觉”、适应客户业务过程。,3,交互式系统,两种模式,为交互式软件系统提供基本的结构化组织。 MVC(Model-View-Controller) 将一个交互式应用程序分为三个组件 PAC (Presentati

2、on-Abstraction-Control) 以合作agent的层次形式定义了交互式软件系统的一种结构。,4,模型-视图-控制器(MVC)模式,该模式将一个交互式应用程序分成3个组件. 模型:包含核心功能和数据。 视图:向用户显示信息。 控制器:处理用户输入。 视图和控制器组成了用户接口。 变更-传播机制保证了模型和用户接口之间的一致性。,5,Example of MVC,Figure1 Information System for Political Selection,6,语境,具有灵活人-机接口的交互式应用程序。 可以灵活选择不同的信息显示方式。 可以灵活选择用户的输入方式。,7,问题

3、(1),关于用户接口的需求尤其易变。 输入方式的改变,显示方式的改变, 不同的用户期望不同的用户界面。即使对于同一个应用,也可能需要集成多种用户界面。 如果把用户接口和功能内核捆绑在一起,难以得到用户界面的灵活特性。,8,问题(2),考虑以下强制条件 同一个信息可以在不同的地方有不同的表示。 应用程序的显示和动作必须立即反映出对数据的操作。 用户的接口易于改变,甚至在运行时可也可以改变。 支持不同的“式样和感觉”标准,或者移植用户接口不应影响应用程序内核的代码。,9,解决方案(1),将应用程序分成三个部分:处理、输出和输入 模型组件:封装了内核数据和功能。模型独立于特定输出表示或者输入方式。

4、视图组件向用户显示信息。视图从模型获得数据。一个模型可能有多个视图。 每个视图有一个相关的控制器组件。控制器组件接受输入,通常将鼠标Move、Click或键盘Type等用户输入翻译成为对视图或者模型的服务请求。 用户仅仅通过控制器与系统交互。,10,解决方案(2),一个模型可以有多个视图。 如果用户通过一个视图的控制器改变了模型,那么依赖于该数据的其他视图也应该反映出这样的变化。 一旦模型的数据发生了变化,模型需要通知所有相关的视图做出相应的变化。 这样的方式可以通过出版者-订阅者设计模式完成。,11,结构(1),模型组件包含了应用程序的功能内核。 封装了相应的数据并输出执行特定应用程序处理的

5、过程。 控制器代表用户调用这些过程。 模型也提供访问它封装的数据的函数,这些函数可以由视图组件使用。,12,结构(2),变更-传播机制 维护了一个模型中相依组件的注册表。 所有视图还有一些控制器在这个表中登记了对变更通知的需求。 模型状态的改变将触发变更-传播机制。每个在表中登记的视图和控制器都会收到变更通知。 变更-传播机制是模型与视图、控制器之间的唯一连接。,13,结构(3),视图组件向用户呈现信息 不同的视图用不同的方法呈现信息。 每个组件都有一个更新函数。这个函数被模型变更通知激活。 这个函数被激活(此时模型已经改变)后,将使得视图重新和模型一致。 在初始化阶段,视图向模型登记请求变更

6、通知。每个视图将创建一个合适的控制器。,14,结构(4),控制器组件接受作为事件的用户输入。 事件如何发送到控制器由用户界面平台决定。 事件被翻译成为对模型或者视图的请求。 如果控制器的行为依赖于模型的状态,那么控制器也需要向模型登记请求变更通知。例如:模型的改变使一个菜单输入能用或禁用时。,15,结构(5),Figure 2 Class diagram of Political Selection,16,动态特征(1),场景 用户输入导致模型变化,并触发变更-传播机制。 控制器接受到事件,解释事件并且启动模型的服务过程。 模型执行相应的过程,并导致内部状态的变化。 模型调用其更新过程,向所有

7、登记请求了变更-传播机制的视图和控制器发出通知。 每个视图从模型中读取新数据并且重新显示。 每个控制器修改自己的行为,比如禁用某个功能。 最初的控制器恢复控制并从事件处理过程返回。,17,动态特征(2),用户输入导致模型变化,并触发变更-传播机制的过程,18,动态特征(3),场景初始化过程 创建模型实例,并初始化其数据。 创建视图对象,并用对模型的引用作为其初始化参数之一。 视图通过调用附属过程支持变更-传播机制。 视图创建控制器,此时将模型和视图的引用作为参数传递给控制器初始化过程。 控制器通过调用附属过程来支持变更-传播机制。 初始化完成,应用程序开始处理事件。,19,动态特征(4),MV

8、C系统的初始化过程,Main prog.,Model,View,Controller,initialize,view,model,view,start,Model,attach,makeController,initialize,attach,controller,20,实现(1),将人机交互从核心功能中分离出来 设计模型组件来封装内核所需要的数据和功能。 提供访问待显示数据的功能。 确定模型功能的哪一部分应该通过控制器向用户展示。,21,实现(1),class Model List votes; List parties; public: Model(List partyNames); /

9、access interface for modification by controller void clearVotes(); /set voing values to 0 void changeVote(String party, long vote); / factory functions for view access to data Iterator makeVoteIterator() return Iterator(votes); Iterator makePartyIterator() return Iterator(parties); /.to be continued

10、 ,22,实现(2),实现变更-传播机制 采用出版者-订阅者设计模式。 模型组件作为出版者,视图和控制器作为订阅者。 提供过程,使得视图和控制器可以自由订阅和退定通知。 模型的过程如果改变了状态,那么需要通知每个订阅者。 在有些框架软件中,这个机制已经被隐含实现了。,23,class Observer common ancestor for view and controller public: virtual void update() /default is no-op ; class Model /.continued public: void attach(Observer *s) r

11、egistry.add(s); void detach(Observer *s) registry.remove(s); protected: virtural void notify(); private: Set registry; ; void Model:notify() /call update for all observers Iterator iter(registry); while(iter.next() iter.curr()-update(); ,24,实现(3),设计并实现视图 设计视图的外观,并实现画图过程来将视图显示在屏幕上(需要使用用户界面平台的功能)。 实现更

12、新过程来反映模型的变化。 可以简单地调用画图功能,但是不适应模型频繁变化的情况。 向更新过程提供一些参数来确定是否重画,以及重画范围。 可以通过累积变化的方式减少重画的频率。 还需要实现视图的初始化过程。 支持变更-传播机制;初始化控制器。,25,class view: public Observer public: View(Model *m) : myModel(m), myController(0) myModel-attach(this); virtual View() myModel-detach(this); virtual void update() this-draw(); /

13、abstract interface to be redefined: virtual void initialize(); /see below virtual void draw();/ (re-) display view /.to be continued below Model *getModel() return myModel; Controller *getController() return myController; protected: Model*myModel; Controller*myController;/ set by initialize ; class

14、BarChartView :public View public: BarChartView (Model *m) : View(m) virtual void draw(); ; void BarChartView:draw() /.to be continued ,26,实现(4),设计并实现控制器 对于每个视图,指定回应用户动作的系统行为。 控制器用一个专用的过程来接受并且解释这些用户动作(事件)。 可以考虑使用command设计模式来隔离模型和控制器之间的联系。,27,实现(4),class Controller : public Observer public: virtual vo

15、id handleEvent(Event *) /default = no op Controller( View *v) : myView(v) myModel = myView-getModel(); myModel-attach(this); virtual Controller() myModel-detach(this); virtual void update() protected: Model*myModel; View*myView; ;,28,实现(5),设计并实现视图-控制器关系 视图在其初始化期间创建和它关联的控制器。 可以考虑使用工厂方法(factory method

16、)设计模式来建立视图和控制器的类层次结构。,29,class view: public Observer public: / C+ deficit: use initialize to call right factory method virtual void initialize() myController = makeController(); virtual Controller *makeController() return new Controller(this); ; class TableController : public Controller public: Tabl

17、eController(TableView *tv) : Controller(tv) virtual void handleEvent(Event *e) / . interpret event e / for instance, update votes of a party if(vote ,30,实现(6),实现MVC的总体的初始化部分 首先初始化模型。 创建和初始化视图。 初始化之后进入一个循环,或者包含循环的过程。 在MFC中使用AppWizard时,这个部分通常已经被实现了。,31,实现(6),main() / initialize model List parties;part

18、ies.append(black); parties.append(blue );parties.append(red ); parties.append(green);parties.append(oth. ); Model m(parties); /initialize views TableView *v1 = new TableView( /now start event processing .,32,实现(7),创建动态视图 如果应用程序允许动态打开和关闭视图,那么可以提供用来管理这些视图的组件。 该组件可以在最后一个视图被关闭的时候终止程序。,33,实现(8),可插入的控制器 视

19、图和控制器之间可以分离来支持一个视图不同控制器的组合。 这种灵活性可以用来实现操作的不同模式。 可以灵活地将一个新的输入输出设备和应用程序加入到一起。,34,class View : public Observer / . continued public: virtual controller *setController(Controller *ctlr); ; main() /. / exchange controller delete v1-setController( new Controller(v1); / this one is read only / . /open anot

20、her read-only table view; TableView *v3 = new TableView( / make v3 read-only / continue event processing / . ,35,实现(9),层次化视图和控制器的基础结构 一个用户界面可以依靠预先定义好的视图的对象来构建。 可以考虑组合(composite)设计模式来实现这样的处理。 当有多个控制器的时候,可以考虑职责链(Chain of Responsibility)设计模式来处理。,36,实现(10),进一步去除系统依赖性 可以考虑建立一个视图类和控制器类的集合,希望这些类的实现是平台无关的。 可以考虑使用桥接(Bridge)模式,在这些类和基础平台软件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论