MVC模式

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

MVC体系结构模式MVC体系结构模式教学目标:掌握MVC模式的概念熟练掌握MVC模式的语境、问题与解决方案掌握MVC模式的结构与实现教学重点:掌握MVC模式的概念及其语境、问题与解决方案教学难点:熟练掌握MVC模式的语境、问题与解决方案交互式系统系统与用户的交互:主要通过GUI目的:增强可用性主要挑战:保持功能内核独立于用户接口UI的易变性:“式样和感觉”、适应客户业务过程。交互式系统两种模式,为交互式软件系统提供基本的结构化组织。MVC(Model-View-Controller)将一个交互式应用程序分为三个组件PAC(Presentation-Abstraction-Control)以合作agent的层次形式定义了交互式软件系统的一种结构。模型-视图-控制器(MVC)模式该模式将一个交互式应用程序分成3个组件.模型:包含核心功能和数据。视图:向用户显示信息。控制器:处理用户输入。视图和控制器组成了用户接口。变更-传播机制保证了模型和用户接口之间的一致性。ExampleofMVCFigure1InformationSystemforPoliticalSelection10%6%39%43%2%PieChart43396102Cube-BarChartBlack43RedBlueGreenOthers396102Black:43%Red:39%Blue:6%Green:10%Others:2%SpeadsheetCoreDataLineChart语境具有灵活人-机接口的交互式应用程序。可以灵活选择不同的信息显示方式。可以灵活选择用户的输入方式。问题(1)关于用户接口的需求尤其易变。输入方式的改变,显示方式的改变,…不同的用户期望不同的用户界面。即使对于同一个应用,也可能需要集成多种用户界面。如果把用户接口和功能内核捆绑在一起,难以得到用户界面的灵活特性。问题(2)考虑以下强制条件同一个信息可以在不同的地方有不同的表示。应用程序的显示和动作必须立即反映出对数据的操作。用户的接口易于改变,甚至在运行时可也可以改变。支持不同的“式样和感觉”标准,或者移植用户接口不应影响应用程序内核的代码。解决方案(1)将应用程序分成三个部分:处理、输出和输入模型组件:封装了内核数据和功能。模型独立于特定输出表示或者输入方式。视图组件向用户显示信息。视图从模型获得数据。一个模型可能有多个视图。每个视图有一个相关的控制器组件。控制器组件接受输入,通常将鼠标Move、Click或键盘Type等用户输入翻译成为对视图或者模型的服务请求。用户仅仅通过控制器与系统交互。解决方案(2)一个模型可以有多个视图。如果用户通过一个视图的控制器改变了模型,那么依赖于该数据的其他视图也应该反映出这样的变化。一旦模型的数据发生了变化,模型需要通知所有相关的视图做出相应的变化。这样的方式可以通过出版者-订阅者设计模式完成。结构(1)模型组件包含了应用程序的功能内核。封装了相应的数据并输出执行特定应用程序处理的过程。控制器代表用户调用这些过程。模型也提供访问它封装的数据的函数,这些函数可以由视图组件使用。结构(2)变更-传播机制维护了一个模型中相依组件的注册表。所有视图还有一些控制器在这个表中登记了对变更通知的需求。模型状态的改变将触发变更-传播机制。每个在表中登记的视图和控制器都会收到变更通知。变更-传播机制是模型与视图、控制器之间的唯一连接。结构(3)视图组件向用户呈现信息不同的视图用不同的方法呈现信息。每个组件都有一个更新函数。这个函数被模型变更通知激活。这个函数被激活(此时模型已经改变)后,将使得视图重新和模型一致。在初始化阶段,视图向模型登记请求变更通知。每个视图将创建一个合适的控制器。结构(4)控制器组件接受作为事件的用户输入。事件如何发送到控制器由用户界面平台决定。事件被翻译成为对模型或者视图的请求。如果控制器的行为依赖于模型的状态,那么控制器也需要向模型登记请求变更通知。例如:模型的改变使一个菜单输入能用或禁用时。结构(5)Figure2ClassdiagramofPoliticalSelection动态特征(1)场景Ⅰ用户输入导致模型变化,并触发变更-传播机制。控制器接受到事件,解释事件并且启动模型的服务过程。模型执行相应的过程,并导致内部状态的变化。模型调用其更新过程,向所有登记请求了变更-传播机制的视图和控制器发出通知。每个视图从模型中读取新数据并且重新显示。每个控制器修改自己的行为,比如禁用某个功能。最初的控制器恢复控制并从事件处理过程返回。动态特征(2):Controller:Model:ViewservicehandleEventnotifyupdatedisplaygetDataupdategetData用户输入导致模型变化,并触发变更-传播机制的过程动态特征(3)场景Ⅱ初始化过程创建模型实例,并初始化其数据。创建视图对象,并用对模型的引用作为其初始化参数之一。视图通过调用附属过程支持变更-传播机制。视图创建控制器,此时将模型和视图的引用作为参数传递给控制器初始化过程。控制器通过调用附属过程来支持变更-传播机制。初始化完成,应用程序开始处理事件。动态特征(4)MVC系统的初始化过程Mainprog.ModelViewControllerinitializeviewmodel,viewstartModelattachmakeControllerinitializeattachcontroller实现(1)将人机交互从核心功能中分离出来设计模型组件来封装内核所需要的数据和功能。提供访问待显示数据的功能。确定模型功能的哪一部分应该通过控制器向用户展示。实现(1)classModel{Listlongvotes;ListStringparties;public:Model(ListStringpartyNames);//accessinterfaceformodificationbycontrollervoidclearVotes();//setvoingvaluesto0voidchangeVote(Stringparty,longvote);//factoryfunctionsforviewaccesstodataIteratorlongmakeVoteIterator(){returnIteratorlong(votes);}IteratorStringmakePartyIterator(){returnIteratorString(parties);}//...tobecontinued}实现(2)实现变更-传播机制采用出版者-订阅者设计模式。模型组件作为出版者,视图和控制器作为订阅者。提供过程,使得视图和控制器可以自由订阅和退定通知。模型的过程如果改变了状态,那么需要通知每个订阅者。在有些框架软件中,这个机制已经被隐含实现了。classObserver{commonancestorforviewandcontrollerpublic:virtualvoidupdate(){}//defaultisno-op};classModel{//...continuedpublic:voidattach(Observer*s){registry.add(s);}voiddetach(Observer*s){registry.remove(s);}protected:virturalvoidnotify();private:SetObserver*registry;};voidModel::notify(){//callupdateforallobserversIteratorObserver*iter(registry);while(iter.next()){iter.curr()-update();}实现(3)设计并实现视图设计视图的外观,并实现画图过程来将视图显示在屏幕上(需要使用用户界面平台的功能)。实现更新过程来反映模型的变化。可以简单地调用画图功能,但是不适应模型频繁变化的情况。向更新过程提供一些参数来确定是否重画,以及重画范围。可以通过累积变化的方式减少重画的频率。还需要实现视图的初始化过程。支持变更-传播机制;初始化控制器。classview:publicObserver{public:View(Model*m):myModel(m),myController(0){myModel-attach(this);}virtual~View(){myModel-detach(this);}virtualvoidupdate(){this-draw();}//abstractinterfacetoberedefined:virtualvoidinitialize();//seebelowvirtualvoiddraw();//(re-)displayview//...tobecontinuedbelowModel*getModel(){returnmyModel;}Controller*getController(){returnmyController;}protected:Model*myModel;Controller*myController;//setbyinitialize};classBarChartView:publicView{public:BarChartView(Model*m):View(m){}virtualvoiddraw();};voidBarChartView::draw(){//...tobecontinued}实现(4)设计并实现控制器对于每个视图,指定回应用户动作的系统行为。控制器用一个专用的过程来接受并且解释这些用户动作(事件)。可以考虑使用command设计模式来隔离模型和控制器之间的联系。实现(4)classController:publicObserver{public:virtualvoidhandleEvent(Event*){}//default=noopController(View*v):myView(v){myModel=myView-getModel();myModel-attach(this);}virtual~Controller(){myModel-detach(this);}virtualvoidupdate()protected:Model*myModel;View*myView;};实现(5)设计并实现视图-控制器关系视图在其初始化期间创建和它关联的控制器。可以考虑使用工厂方法(factorymethod)设计模式来建立视图和控制器的类层次结构。classview:publicObserver{public://C++deficit:useinitializetocallrightfactorymethodvirtualvoidinitialize(){myController=makeController();}virtualController*makeController(){returnnewController(this);}};classTableController:publicController{public:TableController(TableView*tv):Controller(tv){}virtualvoidhandleEvent(Event*e){//...interpretevente//forinstance,updatevotesofapartyif(vote&&party){//entrycomplete:myModel-changeVote(party,vote);

1 / 43
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功