区别就是当“实现”发生根本性的变更时(比如数据库平台更换导致SQL语句变更),如果直接使用实现类作为接口,则需要直接“修改”实现类的代码;而如果使用 接口 + 实现类 模式, 则只需“新建”一个实现类,并切换接口对应的实现(一般情况下这只需要修改配置文件)。
一般情况下,“修改”和“新建”并没什么区别,直接调用实现类的方法,并不需要知道方法内部的实现,其透明性和 接口 + 实现类 的模式是一样的;但如果考虑到一个软件机构的代码一致性的话,区别就很大了。对一个成熟的软件机构来说,同名(包括包名和类名)类文件的功能应该基本相同,虽然这些代码文件属于不同的系统。 如果BookDAO类在系统A中使用SQL SERVER,而在系统B中对应Oracle,这是很不合适的;而如果采用 接口 + 实现类 的模式, 可以将接口名称为BookDAO,而在两个系统中的实现类分别叫做BookDAOSqlServer和BookDAOOracle,这样就比较体面了