其实对于耦合这个概念没有太多的实际经验,只是觉得耦合就是代码之间产生了依赖,比如需要对于一个数据库连接,需要对其事务管理,不同的数据库的事务不同,具体的实现也会不同,比如:
MySQLConnection conn = new MySQLConnection();
MySQLTransaction tran = conn.getMySQLTransaction();
tran.commit();
如果这个时候不是用mysql数据库,而是用oracle,代码就全部必须更改,这样,客户端的代码完全依赖于服务器端;
OracleConnection conn = new OralceConnection();
OracleTransaction tran = conn.getOracleTransaction();
tran.commit();
对于这种现象,java提供了很好的解决办法就是引用接口概念,将具有一些列相同行为的对象进行抽象,称其接口(interface),从而分离出模块之间的耦合,用上面事务的例子,声明一个Connection接口,封装一个数据库事务对象,这里对于数据库的事务,也采用接口声明,为了区别客户端对于不同数据库的需求,这里在获取连接的时候采用参数构造数据库连接,下面是简单代码:
interface Connection{
public Transaction getTransaction();
}
事务接口:
interface Transaction{
public void commit();
}
MySQL的Connection:
public class MySQLConnection implements Connection{
public Transaction getTransaction(){
return new MySQLTransaction();
}
}
Oracle的Connection:
public class OracleConnection implements Connection{
public Transaction getTransaction(){
return new OracleTransaction();
}
}
具体的事务代码就不写了,反正是对于不同的commit会有不同的实现,现在用简单工厂方法实现从连接池获取连接的ConnectionPool的getConnection():
public class ConnectionPool{
public Connection getConnection(String str){
if(str == "oracle"){ return new OracleConnection();}
else if(str == "mysql"){ return new MySQLConnection();}
else{ System.out.println("there is no Connection");}
}
}
好了,现在对于在客户端的代码,获取相应的数据库连接,产生对应的事务处理对象,只需要如下代码:
Connection conn = ConnectionPool.getConnection("XXX");
Transaction tran = conn.getTransaction();
tran.commit();
这样,产生需要的数据库连接,及对应的事务处理都不许要重写代码,只需声明需要的数据库名,代码间的耦合状况被松散了。