Java接口与担任的本质
当前位置:以往代写 > JAVA 教程 >Java接口与担任的本质
2019-06-14

Java接口与担任的本质

Java接口与担任的本质

计较机学院研二的兄弟与我接头Java,一晤面,几个问题全是关于接口,接口有什么用?为什么要用接口?什么时候该利用接口?很名誉他们不是问我Java如何毗连SQL Server,可能是如何开拓J2EE应用,这类问题有杀伤力,避之则吉。本年计较机学院本科有个结业设计课题是做J2ME,选这个题目标学生在5月末都还在苦着脸研究java.util.*这个包,这个这个……唉。

大大都人认为,接口的意义在于顶替多重担任。众所周知Java没有c++那样多重担任的机制,可是却可以或许实作多个接口。其实这样做是很牵强的,接口和担任是完全差异的对象,接口没有本领取代多重担任,也没有这个义务。接口的浸染,一言以蔽之,就是符号类的种别(type of class)。把差异范例的类归于差异的接口,可以更好的打点他们。OO的精华,我觉得,是对工具的抽象,最能浮现这一点的就是接口。为什么我们接头设计模式都只针对具备了抽象本领的语言(好比c++、java、c#等),就是因为设计模式所研究的,实际上就是如何公道的去抽象。(cowboy的名言是“抽象就是抽去像的部门”,看似挖苦,实以致理)。

设计模式中最基本的是工场模式(Factory),在我最近的一个很简朴的应用中,我想只管的让我的措施可以或许在多个数据库间移植,虽然,这涉及许多问题,单是如何兼容差异DBMS的SQL就让人头痛。我们不妨先把问题简朴化,只思量如何毗连差异的数据库。

假设我有许多个类,别离是Mysql.java、SQLServer.java、Oracle.java、DB2.java,他们别离毗连差异的数据库,统一返回一个Connection工具,而且都有一个close要领,用于封锁毗连。只需要针对你的DBMS,选择差异的类,就可以用了,可是我的用户他会利用什么数据库?我不知道,我但愿的是只管少的修改代码,就能满意他的需要。我可以抽象如下接口:

package org.bromon.test;
public interface DB
{
   java.sql.Connection openDB(String url,String user,String password);
   void close();
}

这个接口只界说两个要领,没有任何有实际意义的代码,详细的代码由实作这个接口的类来给出,好比Mysql.java:

Package org.bromon.test;
import java.sql.*;
public class Mysql implements DB
{
   private String url=”jdbc:mysql:localhost:3306/test”;
   private String user=”root”;
   private String password=””;
   private Connection conn;
   public Connection openDB(url,user,password)
   {
     //毗连数据库的代码
   }
   public void close()
   {
     //封锁数据库
   }
}

雷同的虽然尚有Oracle.java等等,接口DB给这些类归了个类,在应用措施中我们这样界说工具:

org.bromon.test.DB myDB;

利用myDB来操纵数据库,就可以不消管实际上我所利用的是哪个类,这就是所谓的“开-闭”原则。可是问题在于接口是不能实例化的,myDB=new DB(),这样的代码是绝对错误的,我们只能myDB=new Mysql()可能myDB=new Oracle()。贫苦了,我照旧需要指定详细实例化的是哪个类,用了接口跟没用一样。所以我们需要一个工场:

package org.bromon.test;
public class DBFactory
{
   public static DB Connection getConn()
   {
     Return(new Mysql());
   }
}

所以实例化的代码酿成:myDB=DBFactory.getConn();

这就是23种模式中最基本的普通工场(Factory),工场类认真详细实例化哪个类,而其他的措施逻辑都是针对DB这个接口举办操纵,这就是“针对接口编程”。责任都被推卸给工场类了,虽然你也可以继承界说工场接口,继承把责任上抛,这就演酿成抽象工场(Abstract Factory)。

整个进程中接口不认真任何详细操纵,其他的措施要毗连数据库的话,只需要结构一个DB工具就OK,而不督工场类如何变革。这就是接口的意义—-抽象。

担任的观念不消多说,很好领略。为什么要担任呢?因为你想重用代码?这绝对不是来由,担任的意义也在于抽象,而不是代码重用。假如工具A有一个run()要领,工具B也想有这个要领,所以有人就Class B extends A。这是不经大脑的做法。假如在B中实例化一个A,挪用A的Run()要领,是不是可以到达同样的目标?如下:

Class B
{
   A a=new A();
   a.run();
}

这就是操作类的聚合来重用代码,是委派模式的雏形,是GoF一贯建议的做法。

那么担任的意义安在?其实这是汗青原因造成的,最开始的OO语言只有担任,没有接口,所以只能以担任来实现抽象,请必然留意,担任的本意在于抽象,而非代码重用(固然担任也有这个浸染),这是许多Java烂书最严重的错误之一,它们所造成的阴影,我至今还没有完全挣脱,坏书害人啊,尤其是入门类的,流毒太大。什么时候应该利用担任?只在抽象类中利用,其他环境下只管不利用。抽象类也是不能实例化的,它仅仅提供一个模版罢了,这就很能说明问题。

#p#分页标题#e#

软件开拓的万恶之源,一是反复代码而不是重用代码,二是烂用担任,尤以c++措施员为甚。Java中取缔多重担任,目标就是避免烂用担任,实长短常明智的做法,不外许多人都不领略。Java可以或许更好的浮现设计,这是让我出神的原因之一。

    关键字:

在线提交作业