JAVA中使用介面實現松耦合

jimmylai發表於2006-12-06
松耦合就是降低系統部件和部件之間的耦合性,也就是降低部件的依賴性,使得部件之間相對獨立,這樣對於日後系統的維護及擴充套件都是很有好處的,然而在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中程式碼的互動


這種做法不會給系統新增任何亂七八糟的技術或東西,保持系統的清新、整潔。今後我們要維護或擴充套件系統的時候,根據需要重新開發或改變某些介面就可以了。


相關文章