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中程式碼的互動
這種做法不會給系統新增任何亂七八糟的技術或東西,保持系統的清新、整潔。今後我們要維護或擴充套件系統的時候,根據需要重新開發或改變某些介面就可以了。
首先是資料工廠技術,這種技術使用到了傳統的介面的使用方式,而且有一套它自己的做法,然而卻因為在使用過程中需要寫透過工廠類來取控制程式碼的程式碼而受爭議,於是又出現了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中程式碼的互動
這種做法不會給系統新增任何亂七八糟的技術或東西,保持系統的清新、整潔。今後我們要維護或擴充套件系統的時候,根據需要重新開發或改變某些介面就可以了。
相關文章
- 六邊形架構:使用事件驅動的無伺服器實現松耦合 - Ellerby架構事件伺服器
- Java中如何使用泛型實現介面中的列表集合?Java泛型
- 訊息耦合還是介面耦合
- 銀行IT系統必經的松耦合,看完就懂了
- 深入淺出Java中Map介面的實現Java
- JAVA--set介面及其實現類的使用Java
- 簡單的list介面和edit介面使用java swing實現Java
- 精通介面隔離原則,輕鬆實現高內聚、低耦合架構架構
- MEF實現設計上的“鬆耦合”(終結篇)面向介面程式設計程式設計
- 使用介面實現RecyclerView中的item點選事件View事件
- 設計習慣比較:高凝聚/松耦合、DRY/錯誤抽象 - Jesse抽象
- java實現zabbix介面開發Java
- 高內聚,低耦合的實現方式
- 如何實現軟體設計中的高凝聚和鬆耦合? - thevaluable
- 使用Java實現在SQLserver中實現圖片的儲存JavaSQLServer
- 在 Zig 中實現介面
- MEF實現設計上的“鬆耦合”(1)
- MEF實現設計上的“鬆耦合”(2)
- java實現網易雲簡訊介面Java
- java 介面,介面的特性,介面實現多型,面向介面程式設計Java多型程式設計
- GOLANG使用嵌入結構實現介面Golang
- Comparable介面的實現和使用
- Java中ListIterator介面Java
- Java中的介面Java
- Java實現DDD中UnitOfWorkJava
- 杉巖資料實現與OpenStack的全面緊耦合
- 在Java中,使用HttpUtils實現傳送HTTP請求JavaHTTP
- JAVA第六章:介面與實現Java
- 中央氣象局天氣預報介面---java實現Java
- Java的代理模式(通過公共介面實現)Java模式
- 使用 Java實現mTLS呼叫JavaTLS
- Java之實現多執行緒的方式二:實現Runnable介面Java執行緒
- 介面的使用(Java)Java
- 使用AIDL實現跨程式介面回掉AI
- Rust使用Sauron實現Web介面互動RustWeb
- Go 語言介面及使用介面實現連結串列插入Go
- Java中類繼承、介面實現的一些細節(長期更新)Java繼承
- Spring使用實現類注入為什麼會導致高耦合度(舉例)Spring