面向接口编程
转自:https://blog.csdn.net/Cyy19970527/article/details/83177996
1.什么是面向接口编程?
面向接口编程是开发程序的功能先定义接口,接口中定义约定好的功能方法声明,通过实现该接口进行功能的实现,完成软件或项目的要求.软件或项目随着时间的不断变化,软件的功能要进行升级或完善,开发人员只需要创建不同的新类重新实现该接口中所有方法,就可以达到系统升级和扩展的目的.
2.面向接口编程与面向对象开发的区别:
面向对象开发:
UserDao dao = new UserDao();
假设项目开发中dao层的技术要升级改造,那么面向对象开发有两种实现方式
将UserDao中的代码删除,全部重写,但是方法名称不允许改变,为了不影响其他层,如service层调用dao的方法
创建一个新的类,如:UserDaoTwo 所有的方法名称照搬,用新技术重写方法体中的内容,但是需要调用dao层的位置,要全部更换为新的类,new UserDaoTwo();
面向接口编程:
UserDao dao = new UserDaoImpl();
1.项目需要升级改造时:
不需要修改原来的类,只要创建一个新的类,实现这个接口,以前的方法全部都有,只要重写方法体即可,不会漏写
为了不在调用dao处,修改多次,可以写为UserDao dao = 工具类.getImpl(); 这时如果我们项目升级过程中更改了实现类,只需要在工具类中修改一次,项目中就全部修改了
这时我们又发现,工具类中如果给多个接口返回实现类,就有如下代码冗余的问题:
public static Object getBean(){
return new UserDaoImpl();
}
public static Object getCategoryBean(){
return new CategoryDaoImpl();
}
public static Object getFavoriteDaoImpl(){
return new FavoriteDaoImpl();
}
这时就出现了,面向接口编程的最终版:
UserDao 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();
}
}
配置文件:bean.properties 格式为key=value书写
3.面向接口编程的好处
降低了程序的耦合性.其能够最大限度的解耦,所谓解耦既是解耦合的意思,它和耦合相对。耦合就是联系,耦合越强,联系越紧密。在程序中紧密的联系并不是一件好的事情,因为两种事物之间联系越紧密,你更换其中之一的难度就越大,扩展功能和debug的难度也就越大。
易扩展. 我们知道程序设计的原则是对修改关闭,对新增开放.面向接口编程扩展功能只需要创建新实现类重写接口方法进行升级扩展就可以,达到了在不修改源码的基础上扩展的目的.
易维护
————————————————
版权声明:本文为CSDN博主「我恐怕是个废柴了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Cyy19970527/article/details/83177996