|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,项目MVC形式在j2me项目中的使用(一)
FavoYangEmail:favoyang@yahoo.com接待交换
Keywords:MVCj2meUI形式
内容提纲:
本文扼要的先容了MVC形式的头脑,并剖析了MVC形式的利害,最初分离MIDP平台给出几种罕见的MVC形式理论。信任此文对任何一个利用midp平台的商务程序开辟者都或多或少的有所匡助。
版权声明:
本文同时宣布在www.j2medev.com和我的Blog(blog.csdn.net/alikeboy)上,假如必要转载,有三个路子:1)接洽我并经我批准;2)和www.j2medev.com有转载文章互助协定的3)经由过程Rss聚合我的Blog。别的网上转载必要全文转发(包含文章的头部的声明),不要断章取义。
注释:
初识MVC形式
第一次熟悉到MVC形式是从MicrosoftMFC框架所接纳的“文档-视图”模子入手下手的。第一次打仗到这个观点让我镇静不已,很长工夫困扰我的程序框架成绩仿佛水到渠成了。尔后我翻阅了GOF一书中对MVC形式的形貌,促进了对这个形式的一些了解。应当说MVC框架是程序计划范畴的常青树,也是GOF形式中最为主要的形式之一。这一典范的形式被普遍的利用,有太多的程序构架在这一框架之下,从初期的卓面Application到如今盛行的Web。并因各自的需求分歧,MVC有了良多的变种。懂得MVC是每一个程序计划职员的?课,最好可以到达纯熟使用的水平。
我其实不盘算具体先容这一形式,由于细节对照庞大,我口舌笨拙也不简单说分明,人人应当参阅一下有关形式的书本,任何一本都比我要讲的分明。以是此处就一带而过。MVC形式是Model-View-Controller的缩写,中文译为“模子-视图-把持器”。MVC的中心头脑是分别。Model就是对实体类的笼统;View就是Model在屏幕上的暗示;Controller就是和谐者。大概有伴侣发明Controller的形貌几有些含混,不要发急,这个一会还要谈到。也许由于太甚着名,MVC形式的每一个完成都出处很年夜,但他们却都叫做MVC!!弄得初学者一头雾水。常常滥用,最初弄得M.V.C.三者之间的和谐很凌乱。这实在并非他们的错,理清思绪的关头仍是方才提到的一个词“分别”。只管MVC完成分歧,可是头脑是分歧的。
MVC形式的利与弊
先谈长处:
1)将M.V.C.分别可让分歧的专家卖力分歧的模块,一样平常情形下,M部分由熟习数据库,收集传输的专家来卖力;V则交给对UI有研讨的专家。这关于项目标办理者而言是何等的诱人,合作意味着能够进步效力并能够依照传统的义务分别来处置软件开辟历程。对开辟者而言也能够用心于一个范畴。如许做的条件是接口要明白,MVC的分别头脑正为其供应了基本。
2)一旦V的部分产生变更,能够敏捷的重构而不用引发全部工程的返工。现在的软件体现层的部分变更其实是太快了…
3)M的部分,由于充足笼统,能够便利的反复使用,切合OO的头脑。另外一方面我们能够使用JUnit等单位测试工具对M举行测试,包管工程质量。
谈完了长处再来看看弱点:
1)使用MVC形式(也包含近代的其他一些形式)表示我们经由过程多发生一些类,来进步程序的可读性与强健性。附带来的弱点就是类的数目的收缩。说句笑话,MVC就仿佛是发面时用的速效粉一样,是最为便利的代码收缩剂,信任人人都深有体味:)
2)MVC固然界说了M.V.C.个个部件的寄义,但其实细,并且没有十分明白的流动三者之间的接洽。以是一向以来除View没有争辩外,其他方面都有良多争辩,人人都想把本人的了解作为正解。特别是“Model究竟是屏幕数据的汇合仍是实体数据”、“把持器的感化”是两个常常争辩的成绩。后面提过MVC变种良多,这也给初学者留下了很多的圈套。前面分离实例将会剖析几种罕见的做法。
3)MVC的完成本钱偏高。但请注重是这是绝对的,一样平常而言项目越年夜,越能够看出其上风。
罕见的MVC形式理论
上面将会先容在midp平台几种罕见的理论,最初是我习气的做法
M―V情势(大概MC―V、M―VC)
这也是在j2me中一种习用的办法,精华精辟的说这类办法是以屏幕为构造单元的,因此很合适RAD工具的开辟思绪。一个屏幕及其把持被笼统成一个VC类,而这个类中有一个公有的Model对象来代表屏幕上要用到的数据元素。屏幕对象其实不保留任何的实体数据,这些数据被构造在了Model对象中。也许由于屏幕对象很直不雅,把持器的感化也不了了(它尽年夜部分的功效被view或是model代替,详细取决于你的完成),以是也经常称号为model-view形式。情势以下:
classMyFrameextendFrame{
privateModelmodel;
privateStringItemname;
MyFrame(Modelmodel){
this.model=model;
name=newStringItem(model.getName());//哀求模子的数据
append(name);
}
}
classModel{
privateStringname="M-Cpattern";
publicStringgetName(){//这是一个服务接口
returnname;
}
}
下面看到的是个典范的M―V模子,我们能够了解这类以屏幕为中心的分别的寄义。Model构造起屏幕的数据,view向Model索要其但愿显现的数据,注重这一操纵必定要经由过程事后协商好的接口会见,而不是间接操纵。假如呈现庞大的事件逻辑(用户选择的某种操纵),有人将其放在Model端,也有人放在View端,但一样平常上放在Model端,这时候Model带有严峻的Controller的色采。
这类情势的长处长短常的直不雅,也无限的分别了显现和数据。假如常看j2medev.com站长Mingjava的文章,能够看到年夜部分他写的例子都是这类形式。而且这类形式也经常用于RAD工具。
这类形式的弱点是它与RAD工具一样勉励你从屏幕入手下手思索成绩,这常常让你堕入RAD的圈套――不先思索事件的流程,而是从用户接口间接动手往剖析成绩,这常常抹杀了你的全局构想。
Sunblueprints:SmartTicket中利用的MVC形式
出名的蓝图程序SmartTicket中利用了MVC形式,而且这一形式匡助Sun的程序员在MIDP2公布时,疾速的将SmartTicket的view部分从MIDP1.0更新到MIDP2.0。
Sun针对MIDP的特性,计划并改善了这一形式,在SUN的办理办法中是一个很尺度的办法,只是Controller酿成了一个伟大的事件处置器,一切由UI对象搜集到的用户的需求都转发给Controller处置。Controller外部保留了一组常量。在一个dispose(intid)情势的办法里一个伟大的switchcase语句依据对照分歧的常量,处置分歧的哀求。这类手艺偶然也将Controller称为处置器,大概屏幕导航器。这类形式的提出者次要是要会合处置j2me里频仍的画面导航。
良多人都以为,在j2me中将Controller改革成伟大的事件处置器是一个很好的办法。我对此持保存定见。
iFeedback中简化的MVC
为了年夜年夜削减类的数目,iFeedback的作者,将MVC封装到一个类中,用分歧的办法来代表对这三者的分别,这类举措证实对削减类的数目又很年夜匡助。
publicabstractclassMVCComponentimplementsCommandListener{
//Setfromoutsideatbeginning
publicstaticDisplaydisplay;
//Returnsthescreenobjectfromthederivedclass
publicabstractDisplayablegetScreen();
publicDisplayableprepareScreen()throwsException{
if(getScreen()==null){
initModel();
createView();
}else{
updateView();
}
getScreen().setCommandListener((CommandListener)this);
returngetScreen();
}
publicvoidshowScreen(){
try{
display.setCurrent(prepareScreen());
}catch(Exceptione){
e.printStackTrace();
Alerta=newAlert("Errorinshowingscreen");
a.setTimeout(Alert.FOREVER);
display.setCurrent(a);
}
}
//Initialize.IfadatamemberisnotbackedbyRMS,makesure
//itisuninitilzed(null)beforeyouputinvalues.
protectedabstractvoidinitModel()throwsException;
protectedabstractvoidcreateView()throwsException;
protectedabstractvoidupdateView()throwsException;
publicabstractvoidcommandAction(Commandc,Displayables);
}
由于都在一个类内里,你在也不用被MVC三者之间的干系费心了,这类退步的做法,是对MIDP无限资本的让步。
我的习气做法
上面分离我对MVC的了解和人人交换一下。我利用的是一种UML尺度的做法,最年夜水平上对的表现分别的头脑。起首和人人交换一下辞汇表:
View代表屏幕。
View经由过程事后约定好的接口向Controller索要数据,View同时搜集用户的输出,View其实不处置这些输出,而是依据分歧的输出回调Controller分歧的办法。一般View的子类利用UI后缀。
Controller把持器
供应View挪用的接口,卖力和model交换。把持器和View配合担当起和用户交换的感化。
Model泛指一系列的实体对象
必要注重的是我了解的Model并非屏幕数据的构造单元。Model代表一系列的实体对象。由Controller跟Model交换。我以为RAD工具中经常将Model代表屏幕数据的汇合正式招致MVC观点凌乱的一个缘故原由。RAD工具中Model,大致相称于这里的Controller所起的感化。
把持器其实不老是接洽着Model,偶然只是依附干系。而且Controller常常经由过程Model的对应的性命期类来取得Model对象。在这类情势中,层层断绝,View与Controller严密相连,而Model有很高的自力性,能够很好的重用。
一样平常的分离UML计划的历程,对MVC的各个类有响应的定名习气。
View称为Boundary类(界限类)以UI开头
Controller称为Controller类(把持类)以Workflow开头
Model称为Entity类(实体类)以Entity开头大概没有尾缀
Model对应的Lifecycle类(性命周期类)以Locator开头
界限类和把持类的基本类以下
BaseView.java
/**
*@authorFavo
*
*视图类
*/
publicabstractclassBaseView{
publicabstractDisplaygetDisplay();
/**
*复杂的前往包装的屏幕对象,不要做任何筹办屏幕的操纵!
*/
publicabstractDisplayablegetScreen();
/**
*创立屏幕
*/
protectedabstractvoidcreateView()throwsException;
/**
*更新屏幕
*/
publicabstractvoidupdateView()throwsException;
/**
*前往把持器
*/
publicabstractBaseControllergetController();
/**
*筹办屏幕
*前往筹办好的屏幕对象
*/
publicDisplayableprepareScreen()throwsException{
if(getScreen()==null){
createView();
}else{
updateView();
}
returngetScreen();
}
/**
*显现以后屏幕
*/
publicvoiddisplayScreen(){
try{
getDisplay().setCurrent(prepareScreen());
}catch(Exceptione){
e.printStackTrace();
Alertal=newAlert("Error",e.toString()+
+e.getMessage(),null,AlertType.ERROR);
al.setTimeout(Alert.FOREVER);
getDisplay().setCurrent(al);
}
}
}
BaseController.java
/**
*@authorFavo
*
*把持类
*/
publicabstractclassBaseController{
publicabstractBaseViewgetView();
publicabstractvoidsetView(BaseViewview);
}
注重到这些基本的类并没有向MFC框架那样发生完全的框架,而是计划成了笼统类,一来但愿强制人人完成笼统类(避免堕落);二来但愿增添一点天真性。以是两个类之间的通讯就要靠人人撰写的子类的机关函数了。一样平常我的习气是,初始化好把持器,然后将把持器作为参数传给界限类的机关函数,由界限类的机关函数往返调把持器的setView()来完成的。这些步骤是必定要有的,否则会NULLpointerExcpetion哦。
只管实际上大概很明晰,但理论带来的庞大性是惊人的。这恰是软件开辟的成绩,太多的细节困扰这开辟者对年夜局的掌控。本文接上去,将分离最初这类计划头脑,给出一个完全的计划实例。匡助人人从理论的角度了解使用这一形式。敬请人人等候。
从一个编程语言的普及程度来将,一个好的IDE是至关中要的,而现在的java的IDE虽然已经很好了,但是和.net比起来还是稍微差一些的,这是个客观事实。java要想普及的更好。DE是必须加以改进的。 |
|