其实对于耦合这个概念没有太多的实际经验,只是觉得耦合就是代码之间产生了依赖,比如需要对于一个数据库连接,需要对其事务管理,不同的数据库的事务不同,具体的实现也会不同,比如:
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();
这样,产生需要的数据库连接,及对应的事务处理都不许要重写代码,只需声明需要的数据库名,代码间的耦合状况被松散了。