黑马程序员技术交流社区

标题: 分享一个帖子:关于接口的作用 [打印本页]

作者: 李润根    时间: 2012-10-3 13:06
标题: 分享一个帖子:关于接口的作用
刚看到有人问接口的好处的帖子,觉得下面的回复不错,分享一下。


对于接口的作用,在一些小的项目上,很难看出其发挥的优势。这就使一些经常的做小项目的开发人员,做时间久了就感觉不到它有什么好的,有时候写起来还麻烦,干脆不用了。其实,在一些大项目上,接口的作用是发挥地相当的明显的。

  比如:如果你开发业务逻辑代码,当你好不容易的实现了它全部的功能,突然用户需求要改,你在修改你代码的同时,调用你代码的其它人也会改,如果代码关联性强的话,会有很多人都要改动代码,这样一来二去,程序会变得相当的不稳定,而且可能还会出现更多的新Bug,所有人都可能会陷入混乱。

  但如果使用接口的话,在你使用它之前,就要想好它要实现的全部功能(接口实际上就是将功能的封装)。确定下这个接口后,如果用户需求变了,你只要重新写它的实现类,而其它人只会调用你的接口,他不管你是怎么实现的,它只需要接口提供的功能。这样,很可能只需要把你的代码修改就可以了,其他人什么都不用做。同时:这样做的话,使得开发人员能够分工明确,只要确定下来接口了,就可以同时进行开发,提高开发效率。另外,使用接口还有使用方便,可读性强,结构清晰等优点。


转自:http://topic.csdn.net/u/20120820/09/29a8710b-4051-483b-9598-7fd1764c6e2b.html?50546

作者: 李玉生    时间: 2012-10-3 15:02
支持兄弟的
作者: 黄小贝    时间: 2012-10-3 15:13
这个帖子我很久以前就看过了~  18#把我的眼睛亮瞎了
作者: 王海宇    时间: 2012-10-3 20:06
接口在动态代理中的作用也很大。有时候我们在使用某些类(目标类)的时候,需要为这些类的方法添加一些功能,但是我们又无法对这个类进行修改(例如不允许修改或不知道源码),就可以通过动态代理技术,实例化出该类的接口的对象,调用这个接口对象的每个方法,都会在这个对象的内部调用目标对象的相应的方法,这样一来我们只要在接口对象调用目标对象的方法之前或之后添加一些新功能,就可以实现既不用修改目标类的源码,又能为其添加新功能的想法了
作者: 伯乐与千里    时间: 2012-10-3 22:50
顶顶顶!看了后我感觉思路清晰了好多。
作者: 黄小贝    时间: 2012-10-4 00:38
王海宇 发表于 2012-10-3 20:06
接口在动态代理中的作用也很大。有时候我们在使用某些类(目标类)的时候,需要为这些类的方法添加一些功能 ...

Spring的AOP的实现的要点在于代理的取得,Spring的代理技术分两种,第一种是你说的动态代理取得代理类,第二种是使用CGLIB得到代理类,前者的特点在于必须要实现接口,后者则不需要~~

下面是AOP取得代理类的核心代码~

public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
                if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
                        Class targetClass = config.getTargetClass();
                        if (targetClass == null) {
                                throw new AopConfigException("TargetSource cannot determine target class: " +
                                                "Either an interface or a target is required for proxy creation.");
                        }
                        if (targetClass.isInterface()) {//如果实现了接口~~就用JDK动态代理
                                return new JdkDynamicAopProxy(config);
                        }
                        if (!cglibAvailable) {
                                throw new AopConfigException(
                                                "Cannot proxy target class because CGLIB2 is not available. " +
                                                "Add CGLIB to the class path or specify proxy interfaces.");
                        }
                        return CglibProxyFactory.createCglibProxy(config);//CGLIB取得
                }
                else {
                        return new JdkDynamicAopProxy(config);//JDK的动态代理取得
                }
        }





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2