JAVA中使用接口实现松耦合
松耦合就是降低系统部件和部件之间的耦合性,也就是降低部件的依赖性,使得部件之间相对独立,这样对于日后系统的维护及扩展都是很有好处的,然而在J2EE领域,为实现松耦合出现的技术可谓让人眼花缭乱,这些技术的出现究竟是使问题简单化了还是复杂化了呢?
首先是数据工厂技术,这种技术使用到了传统的接口的使用方式,而且有一套它自己的做法,然而却因为在使用过程中需要写通过工厂类来取句柄的代码而受争议,于是又出现了Ioc模式,这种在容器或框架上大作文章的做法是好还是坏呢?(既然是框架就应该是个架子,架子需要骨头不需要肉)。
下面我对使用接口去实现松耦合讲一下自己的做法,仅供参考,欢迎大家参与讨论,共同提高。
在计算机硬件里,不同的硬件之间就是靠接口(Interface)来进行衔接的,我们有了一块图形显示卡(Graphic Interface)之后,就可以不停地更换显示器了。然而JAVA中为什么会使用到接口(Interface)这一名词呢,“参照硬件的做法去实现衔接”我想就是JAVA定义接口的最初目的,但是对于如何去具体应用接口或用好接口,JAVA语言的开发者似乎没有给出太多的描述,这就给后者对接口的使用留下了很大的发挥余地和想象空间,于是才有了各种各样的接口使用方法(如数据工厂).
部件的衔接是为了部件的交互,软件系统中部件之间的交互大体上可以分为数据的交互和代码的交互。无论是C、C++还是JAVA里,static存储类型都有着相同的含义,那就是相同类的不同句柄之间在内存中的共享部分,这个共享的部分可以是数据,也可以是代码,我们可以随时地改变这些静态类型的东西,只是在定义这些东西时需要给它初始化而已。这样我们可以把static用到JAVA的接口里来实现数据的共享。然而JAVA对接口的使用却给出了重重的限制,如在接口中不能定义static类型的方法,或者虽然可以定义static类型的属性,但却只能是常量,而不能是变量。但我们可以想办法去绕过这些障碍,例如我使用了HashSet或Collection作为接口中的静态属性,在使用中并没有用到“=”号去改变它们,而却用到了它们的add或remove方法去改变它们,这样在编译时就侥幸地绕过了“JAVA中不允许改变接口里的静态属性”这一检查机制,编译和运行都通过了,并获得了想要的结果。
下面给出这些测试情况:
测试一:实现部件之间数据的交互,写了三个java文件,分别为Interface.java、ClassA.java和ClassB.java。
--------------------------------------------------------------------------------------
import java.util.HashSet;
public interface Interface{
public static HashSet testPro = new HashSet(); //所有实现此接口的类的共享属性
}
--------------------------------------------------------------------------------------
public class ClassB implements Interface{
}
--------------------------------------------------------------------------------------
import java.util.*;
public class ClassA implements Interface{
public static void main(String[] argv){
String str1 = "test1";
ClassB.testPro.add(str1); //ClassB想往外传送数据,便把数据赋给共享属性
//在ClassA中通过共享属性拿到了ClassB想传出的数据
for(Iterator iterator = ClassA.testPro.iterator();iterator.hasNext();){
String tempStr = (String)iterator.next();
System.out.println(tempStr);
}
}
}
--------------------------------------------------------------------------------------
编译、运行都通过,输出:test1 ,结果正确,实现了ClassA和ClassB之间的数据的交互
测试二:实现部件之间代码的交互,同样是这三个JAVA文件。
--------------------------------------------------------------------------------------
import java.util.HashSet;
public interface Interface{
public static ClassA instanceA = new ClassA(); //所有实现此接口的类的共享属性
public static ClassB instanceB = new ClassB(); //所有实现此接口的类的共享属性
}
--------------------------------------------------------------------------------------
public class ClassB implements Interface{
public void method(){
System.out.println("B.method invoked!");
}
}
--------------------------------------------------------------------------------------
public class ClassA implements Interface{
public static void main(String[] argv){
instanceB.method(); //在ClassA中直接可以拿ClassB的句柄来用,因为此句柄是接口里的共享属性
}
}
---------------------------------------------------------------------------------------
测试通过,输出: B.method invoked! ,实现了ClassA和ClassB中代码的交互
这种做法不会给系统添加任何乱七八糟的技术或东西,保持系统的清新、整洁。今后我们要维护或扩展系统的时候,根据需要重新开发或改变某些接口就可以了。