面向接口编程
emm……最近今天在和同学谈论接口编程的好处时候,觉得别人体会不到接口编程的好处,因此简单的说下面向接口编程的好处。内容不多,希望今天的你可以粗略的感受到面向接口编程带来的好处,好了,废话有点多,进入正题。
何为面向接口编程?
百度百科的定义
面向接口编程思想
面向接口编程不与面向对象编程同级,而是附属于面向对象编程思想,是面向对象编程思想的精髓之一。
定义
在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),
而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类
本质
1.接口是一组规则的集合,它规定了实现本接口的类或者接口必须拥有的一组规则。
2.接口是在一定粒度视图上同类事物的抽象表示,实现了多态性。
优点
1.结构清晰,使用方便。
2.提高系统的灵活性,当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改。
3.设计合理的接口,有利于程序的规范化,可并行进行开发,从而提高效率。
4.实现了程序的可插拔性,对于不同的需求切换不同的实现,降低了耦合度,随着系统的复杂性的提高优势会愈加明显。
5.允许多重实现,弥补了继承的缺陷。
缺点
1.增加了设计复杂度,不适用于简单的系统。
2.可能会降低代码的可复用性。
3.可能会降低程序的执行效率。
思想概念说完了,觉得空空的,下面我们通过对比一下和面向对象编程的区别来理解一下。
面向接口编程与面向对象开发的区别:
面向对象开发:
AdminDao dao = new AdminDao();
假设项目开发中dao层的技术要升级改造,那么面向对象开发有两种实现方式
1.将AdminDao中的代码删除,全部重写,但是方法名称不允许改变,为了不影响其他层,如service层调用dao的方法
2.创建一个新的类,如:AdminDao2 所有的方法名称照搬,用新技术重写方法体中的内容,但是需要调用dao层的位置,要全部更换为新的类,new AdminDao2();
面向接口编程:
AdminDao dao = new AdminDaoImpl();
项目需要升级改造时:
不需要修改原来的类,只要创建一个新的类,实现这个接口,以前的方法全部都有,只要重写方法体即可,不会漏写
为了不在调用dao处,修改多次,可以写为AdminDao dao = 工具类.getImpl(); 这时如果我们项目升级过程中更改了实现类,只需要在工具类中修改一次,项目中就全部修改了
这时我们又发现,工具类中如果给多个接口返回实现类,就有如下代码冗余的问题:
public static Object getBean(){
return new UserDaoImpl();
}
public static Object getCategoryBean(){
return new CategoryDaoImpl();
}
public static Object getFavoriteDaoImpl(){
return new FavoriteDaoImpl();
}
这时就出现了,面向接口编程的最终版:
AdminDao dao = 工具类.getImpl(id);在创建实现类的时候,传入一个id. 在配置文件中,根据id唯一标识一个实现类的全限定类名.工具类中只需要根据这个id去配置文件中获得内容,反射 动态实例化创建对象就好了.以后,再修改升级功能时,只需要在配置文件中修改全限定类名就好了
public class BeanFactoryUtils {
public static Object getBean(String id) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
//1.根据传入id 获得配置文件中已经配置好的value属性 ==>全限定类名
ResourceBundle bundle = ResourceBundle.getBundle("bean");//bean为配置文件
String className = bundle.getString(id);
//2.反射 动态实例化对象 ==>>必须有全限定类名 ==>> 字符串 ==>> 抽取到配置文件中
Class clazz = Class.forName(className);
return clazz.newInstance();
}
}
面向接口编程的好处
1.降低了程序的耦合性.其能够最大限度的解耦,所谓解耦既是解耦合的意思,它和耦合相对。耦合就是联系,耦合越强,联系越紧密。在程序中紧密的联系并不是一件好的事情,因为两种事物之间联系越紧密,你更换其中之一的难度就越大,扩展功能和debug的难度也就越大。
2.易扩展. 我们知道程序设计的原则是对修改关闭,对新增开放.面向接口编程扩展功能只需要创建新实现类重写接口方法进行升级扩展就可以,达到了在不修改源码的基础上扩展的目的。
3.易维护
下面说下我个人的理解:
面向接口编程好处:
1.解耦
这一点不再过多述说,相信各位都明白。
2.一种良好的编程习惯
这一层面主要是基于框架,譬如SSM框架,SSH框架等等,用到它们时候,相信你听过最多的就是反射机制,工厂模式,等等,你都可以看到面向接口的影子,你通过调用框架封装好的方法,依照不同的参数返回不同的结果,这些都时接口的影子。事实上,大多数的框架都遵守了按照接口编程的习惯,基于这一前提,我们编写代码时候,也面向接口,这样在使用框架时候,对接,你不会那么累,就像实体类你这样定义
public class User implements Serializable{
//TODO
}
和你这样定义
public class User{
//TODO
}
有什么区别呢?
好处就显而易见了。
3.让系统更灵活等等
这个好处,根本上都是解耦带来的,奈何解耦的好处太重要,因此,再次再次强调一次。
最后的最后总结一下:
希望你不要纠结与面向接口编程究竟是什么?做个程序,做个系统,跑一跑,当需求发生更改的时候,我相信你会明白什么是面向接口编程及它的好处有多重要。