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对象,而不管工厂类如何变化。这就是接口的意义----抽象。继承的概念不用多说,很好理解。为什么要继承呢?因为你想重用代码?这绝对不是理由,继承的意义也在于抽象,而不是代码重用。如果对象A有一个run()方法,对象B也想有这个方法,所以有人就Class B extends A。这是不经大脑的做法。如果在B中实例化一个A,调用A的Run()方法,是不是可以达到同样的目的?如下:
Class B{ A a=new A(); a.run();}
这就是利用类的聚合来重用代码,是委派模式的雏形。那么继承的意义何在?其实这是历史原因造成的,请一定注意,继承的本意在于抽象,而非代码重用(虽然继承也有这个作用),这是初涉Java时最容易犯也是最严重的错误之一,在编程的过程中这个错误所造成的阴影,也许会对你的编程生涯造成严重的影响。什么时候应该使用继承?只在抽象类中使用,其他情况下尽量不使用。抽象类也是不能实例化的,它仅仅提供一个模版而已,这就很能说明问题。