java中面向接口编程的好处

一、

像J2EE中的API规范基本上都是接口,由各应用服务器来实现,比如:WebSphere按照这个接口实现自己的,WebLogic也按照这个接口实现自己的,作为开发者来说我们根本就不用去管谁是怎样实现的,只要按照J2EE的API来写就可以了,根本用不着导入它们的实现包,实际上具体的是由它们自身完成了。

接口说白了,也就是定死了一个框,具体的是糊红纸还是糊黑纸我们都用不着去管的,我们只要知道它是个框,提供 了哪些方法就够了。
举个简单的JDBC的例子吧,比如有个BaseDao接口,现在有MySQLDao实现了一个(我们可以把具体的实现类配在配置 文件中,再通过反射进行实例化),也就类似这样的:
BaseDao dao = (BaseDao)(Class.forName(Config.getDaoName()).newInstance());
其中Config.getDaoName()可以获得配置文件中的配置,比如是:com.bao.dao.impl.MySQLDao。

之后,那些人开始要烧钱了,要改用Oracle了,这样我们只要按BaseDao的定义,再实现一个OracleDao就可以了,再将配置文件中的配置改为:com.bao.dao.impl.OralceDao就可以了,而在已经写好的代码中,我们可以一行不改的进行了数据库移植,这个就是面向对象设计原则中的“开-闭原则”


二、

在项目中的意义:
接口在项目就是一个业务逻辑, 面向接口编程就是先把客户的业务提取出来,作为接口。业务具体实现通过该接口的实现类来完成。当客户需求变化时,只需编写该业务逻辑的新的实现类,通过更改配置文件(例如Spring框架)中该接口的实现类就可以完成需求,不需要改写现有代码,减少对系统的影响。 采用基于接口编程的项目,业务逻辑清晰,代码易懂,方便扩展,可维护性强。即使更换一批人员,新来的人依然可以快速上手。对于公司来说,意义更大。
在Java中的意义: 
   Java本身也是一个不断完善的语言,他也在频繁的改动他的系统API来完善,他的API是一个庞大的体系,互相关联,如果不采用接口,而都是用实现类的话,那么API的改动就会给整个体系带来不稳定。而且如果改动API,那么就会有大量采用旧API的项目因无法正常运行,会损失大量客户。换句话说,JDK已经发布的API是一种承诺,一经发布就不能更改,即使原来API存在各种各样的问题(例如java.util.Properties类就是一个失败的例子)也必须保留,于是在Java里就出现了不建议使用的方法,但JDK依然提供该方法。而且Java语言本身是一个跨平台的语言,为了满足在各个平台下运行,就必须把各种操作做成接口,在编写各个平台下的实现类。
设计模式的体现: 
   在设计模式的原则里的开闭原则,其实就是要使用接口来实现 对扩展开放,对修改关闭。在设计模式的其他原则里也有关于基于接口编程的原则,即依赖倒转的设计原则(DIP)----高层模块不应该依赖于底层模块。二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象(注:来自《敏捷软件开发--原则、模式与实践》Robert C.Martin著)。在使用面向接口的编程过程中, 将具体逻辑与实现分开,减少了各个类之间的相互依赖,当各个类变化时,不需要对已经编写的系统进行改动,添加新的实现类就可以了,不在担心新改动的类对系统的其他模块造成影响。  

接口本质上就是由制定者来协调实现者和调用者之间的关系。
所以通常说的“面向接口编程”可以理解为:  
只有实现者和调用者都遵循“面向接口编程”这个准则,制定者的协调目的才能达到。  
一个老生常谈的例子就是JDBC。
优点:  
接口和实现分离了,适于团队的协作开发。  
主要为了实现松散耦合的系统,便于以后升级,扩展。
缺点:  
设计难了,在你没有写实现的时候,就得想好接口,接口一变,全部乱套,这就是所谓的设计比实现难。  
所以设计接口的人工资都高啊!!!


三、

比如说,你要注册一个用户,前面是业务逻辑,要调用数据访问层的save(user)方法。先写一个数据访问对象的接口

Java code
   
   
public interface IDAO{ void save(User user) throws UserNameExistException; }

jdbc的实现是  
Java code
   
   
public class JDBCDAO implements IDAO{ public void save(User user) throws UserNameExistException{ ..... String sql = "insert into t_user values(?,?,?,?)"; .... PreparedStatement pstm = conn.prepareStatement(sql); pstm.setString(1,user.getName()); .... pstm.executeUpdate(); ...... } }
Hibernate的实现是
Java code
   
   
public class HibernateDAO implements IDAO{ public void save(User user) throws UserNameExistException{ ...... session.save(user); session.getTransaction().commit(); .... } }

你的业务层UserService只要这么写
Java code
   
   
public class UserService{ public void register(String userName,String password,int age,....等等参数){ //假设现在用的是JDBC的实现 IDAO dao = new JDBCDAO();//当你需要替换实现的时候,只要把这个JDBCDAO换成HibernateDAO就可以了,其它代码不需要改。 User user = new User(); user.setName(userName); ...... dao.save(user); } }


转自:参考原文一    参考原文二

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值