|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。承继盘算机学院研二的兄弟与我会商Java,一会晤,几个成绩满是关于接口,接口有甚么用?为何要用接口?甚么时分该利用接口?很光荣他们不是问我Java怎样毗连SQLServer,大概是怎样开辟J2EE使用,这类成绩有杀伤力,避之则吉。往年盘算机学院本科有个卒业计划课题是做J2ME,选这个标题的先生在5月末都还在苦着脸研讨java.util.*这个包,这个这个……唉。
年夜多半人以为,接口的意义在于顶替多重承继。尽人皆知Java没有c++那样多重承继的机制,可是却可以实作多个接口。实在如许做是很牵强的,接口和承继是完整分歧的工具,接口没有才能取代多重承继,也没有这个任务。接口的感化,一言以蔽之,就是标记类的种别(typeofclass)。把分歧范例的类回于分歧的接口,能够更好的办理他们。OO的精华,我觉得,是对对象的笼统,最能表现这一点的就是接口。为何我们会商计划形式都只针对具有了笼统才能的言语(好比c++、java、c#等),就是由于计划形式所研讨的,实践上就是怎样公道的往笼统。(cowboy的名言是“笼统就是抽往像的部分”,看似奚弄,实以致理)。
计划形式中最基本的是工场形式(Factory),在我比来的一个很复杂的使用中,我想只管的让我的程序可以在多个数据库间移植,固然,这触及良多成绩,单是怎样兼容分歧DBMS的SQL就让人头痛。我们无妨先把成绩复杂化,只思索怎样毗连分歧的数据库。
假定我有良多个类,分离是Mysql.java、SQLServer.java、Oracle.java、DB2.java,他们分离毗连分歧的数据库,一致前往一个Connection对象,而且都有一个close办法,用于封闭毗连。只必要针对你的DBMS,选择分歧的类,就能够用了,可是我的用户他会利用甚么数据库?我不晓得,我但愿的是只管少的修正代码,就可以满意他的必要。我能够笼统以下接口:
packageorg.bromon.test;
publicinterfaceDB
{
java.sql.ConnectionopenDB(Stringurl,Stringuser,Stringpassword);
voidclose();
}
这个接口只界说两个办法,没有任何有实践意义的代码,详细的代码由实作这个接口的类来给出,好比Mysql.java:
Packageorg.bromon.test;
importjava.sql.*;
publicclassMysqlimplementsDB
{
privateStringurl=”jdbc:mysql:localhost:3306/test”;
privateStringuser=”root”;
privateStringpassword=””;
privateConnectionconn;
publicConnectionopenDB(url,user,password)
{
//毗连数据库的代码
}
publicvoidclose()
{
//封闭数据库
}
}
相似确当然另有Oracle.java等等,接口DB给这些类回了个类,在使用程序中我们如许界说对象:
org.bromon.test.DBmyDB;
利用myDB来操纵数据库,就能够不必管实践上我所利用的是哪一个类,这就是所谓的“开-闭”准绳。可是成绩在于接口是不克不及实例化的,myDB=newDB(),如许的代码是相对毛病的,我们只能myDB=newMysql()大概myDB=newOracle()。贫苦了,我仍是必要指定详细实例化的是哪一个类,用了接口跟没用一样。以是我们必要一个工场:
packageorg.bromon.test;
publicclassDBFactory
{
publicstaticDBConnectiongetConn()
{
Return(newMysql());
}
}
以是实例化的代码酿成:myDB=DBFactory.getConn();
这就是23种形式中最基本的一般工场(Factory),工场类卖力详细实例化哪一个类,而其他的程序逻辑都是针对DB这个接口举行操纵,这就是“针对接口编程”。义务都被推脱给工场类了,固然你也能够持续界说工场接口,持续把义务上抛,这就演化成笼统工场(AbstractFactory)。
全部过程当中接口不卖力任何详细操纵,其他的程序要毗连数据库的话,只必要机关一个DB对象就OK,而不论工场类怎样变更。这就是接口的意义----笼统。
承继的观点不必多说,很好了解。为何要承继呢?由于你想重用代码?这相对不是来由,承继的意义也在于笼统,而不是代码重用。假如对象A有一个run()办法,对象B也想有这个办法,以是有人就ClassBextendsA。这是不经年夜脑的做法。假如在B中实例化一个A,挪用A的Run()办法,是否是能够到达一样的目标?以下:
ClassB
{
Aa=newA();
a.run();
}
这就是使用类的聚合来重用代码,是委派形式的雏形,是GoF一向倡议的做法。
那末承继的意义安在?实在这是汗青缘故原由酿成的,最入手下手的OO言语只要承继,没有接口,以是只能以承继来完成笼统,请必定注重,承继的本意在于笼统,而非代码重用(固然承继也有这个感化),这是良多Java烂书最严峻的毛病之一,它们所酿成的暗影,我至今还没有完整挣脱,坏书害人啊,特别是进门类的,流毒太年夜。甚么时分应当利用承继?只在笼统类中利用,其他情形下只管不利用。笼统类也是不克不及实例化的,它仅仅供应一个模版罢了,这就很能申明成绩。
软件开辟的万恶之源,一是反复代码而不是重用代码,二是烂用承继,尤以c++程序员为甚。Java中取消多重承继,目标就是停止烂用承继,实长短常明智的做法,不外良多人都不睬解。Java可以更好的表现计划,这是让我出神的缘故原由之一。
还有就是总有人问我到底该学习什么语言,什么语言有前途,那么我的回答是不论是C,C++,java,.net,ruby,asp或是其他语言都可以学,编程的关键不是语言,而是思想。 |
|