軟件構造筆記——5.1各層次的複用與外部表現

根據複用的層次不同,有多種類型的劃分。
Design patterns基於設計模式的複用:體現在抽象和具體對象的交互上;
Component-based development:基於組件層面的複用
Application frameworks:提供一些可進行調整、拓展的抽象或具體類
Legacy system wrapping:只留下接口提供服務

Source code層面:方法、聲明
實現:代碼的複製粘貼(弊端:好多代碼😣)

模塊層面:類和接口(平時實驗中用得較多的)
繼承、組合/聚合委託/關聯
複用形式:類文件、.zip/.jar包(類是最小單位)
(處於方便考慮,相關的類還是放在一個包裏,還要記得爲使用者提供文檔說明哦)
使用方法:添加一下build path,之後在代碼中import一下即可。

委託機制:調用A對象的某功能,而A對象將該功能的實現委託給B對象完成。這個過程可以是顯式的,也可以是隱式的。
顯式:將被委託對象顯式傳遞給任務接收者。
隱式:這種委託通過語言的查詢機制實現。
在這裏插入圖片描述
如在調用某個List對象的sort()方法時,傳入一個new Comparator()對象(當然這個對象的public int compare(Object o1, Object o2)方法要自己重寫),將排序的比較規則交由這個new Comparator()對象的int compare(Object o1, Object o2)方法完成。
類似地,使用 Collection.sort(),這裏需要傳入需要排序的list,它會將排序的比較過程交給list中對象的public int compareTo(Object o) 方法(注意:這裏list中的對象所屬的類型必須已經實現了 Comparable接口中的 public int compareTo(Object o) 方法)。

依賴(Dependency) 關係是類與類之間的聯接。依賴關係表示一個類依賴於另一個類的定義。例如,一個人(Person)可以買車(car)和房子(House),Person類依賴於Car類和House類的定義,因爲Person類引用了Car和House。與關聯不同的是,Person類裏並沒有Car和House類型的屬性,Car和House的實例是以參量的方式傳入到buy()方法中去的。一般而言,依賴關係在Java語言中體現爲 局域變量方法的形參,或者對靜態方法的調用。
在這裏插入圖片描述
關聯(Association 關係是類與類之間的聯接,它使一個類知道另一個類的屬性和方法。關聯可以是雙向的,也可以是單向的。在Java語言中,關聯關係一般使用成員變量來實現。
在這裏插入圖片描述
聚合(Aggregation) 關係是關聯關係的一種,是強的關聯關係。聚合是整體和個體之間的關係。例如,汽車類與引擎類、輪胎類,以及其它的零件類之間的關係便整體和個體的關係。與關聯關係一樣,聚合關係也是通過實例變量實現的。但是關聯關係所涉及的兩個類是處在同一層次上的,而在聚合關係中,兩個類是處在不平等層次上的,一個代表整體,另一個代表部分。

組合(Composition) 關係是關聯關係的一種,是比聚合關係強的關係。它要求普通的聚合關係中 代表整體的對象負責代表部分對象的生命週期,組合關係是 不能共享的。代表整體的對象需要負責保持部分對象和存活,在一些情況下將負責代表部分的對象湮滅掉。代表整體的對象可以將代表部分的對象傳遞給另一個對象,由後者負責此對象的生命週期。換言之,代表部分的對象在每一個時刻只能與一個對象發生組合關係,由後者排他地負責生命週期。部分和整體的生命週期一樣。(類似於一種A owns B的關係)
類似於一種owns關係

類庫層面:API類庫、Maven等
(要易於使用、易於理解,即使在沒有文檔的情況下)

系統層面:框架
框架需要滿足各種不同需求的可拓展性,所以它相對於一般應用程序而言,更抽象。通常框架的使用方式有:
1.通過繼承抽象類,來調用相關的方法(實現hook method)
2.爲能被框架識別的事件,添加相應響應方法(或者被相應方法調用的方法也行)

分類:
黑盒框架:用戶只要負責寫好傳入框架的被委託者即可,例如上面的Comparator與sort()方法
白盒框架:用戶需要通過繼承實現hook method。

相對於類庫
1.框架的自主空間範圍更大,
2.會影響控制流,甚至於整個程序的控制流是由框架決定滴!(而類庫不會。。)
(這就是框架對用戶端代碼所說的:“Don’t call us. We’ll call you.”)
調用關係
在這裏插入圖片描述
3.框架的可拓展性(注意:是可拓展性,不是可修改的!)
4.框架常常調用類庫中的方法,以化簡開發。

可複用的外在特性表現
1.對可複用的類型組建參數化
2.對不同功能進行模塊細化分工實現,並構成一個模塊組
3.對於自滿足複用 的模塊,要自己實現各種模塊 的複用
4.變量不變性:即便內部的實現方式發生變化,但是仍然滿足spec
5.要求開發者提取出常複用的功能模塊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章