來(lái)源:https://blog./2016/10/25/oo_architecture/
原則
靈活運(yùn)用,而非刻意遵循
1. 基礎(chǔ)原則
盡量少的重復(fù)代碼,,低耦合(盡量小的影響),,高內(nèi)聚 模塊,可小到一個(gè)類,,大到一個(gè)系統(tǒng)
模塊間耦合因素
構(gòu)建架構(gòu)時(shí),,需要謹(jǐn)慎耦合的因素
模塊間調(diào)用 模塊間傳遞的數(shù)據(jù)量 模塊間控制 模塊間接口復(fù)雜度
模塊間耦合從弱到強(qiáng)順序
構(gòu)建架構(gòu)或簡(jiǎn)單的類時(shí),需要根據(jù)實(shí)際情況盡量契合弱的模塊間耦合關(guān)系 做到職責(zé)分明,,簡(jiǎn)單輕量,,盡量少的潛在性的數(shù)據(jù)流動(dòng),盡量少的相互影響,,避免牽一發(fā)而動(dòng)全身
非直接耦合: 相互之間沒(méi)有直接關(guān)系,,而是由第三方模塊控制和調(diào)用 數(shù)據(jù)耦合: 通過(guò)傳遞java的內(nèi)置數(shù)據(jù)類型通訊 標(biāo)記耦合: 都引用了共同的數(shù)據(jù)結(jié)構(gòu),并且通過(guò)傳遞該數(shù)據(jù)結(jié)構(gòu)通訊 控制耦合: 通過(guò)傳遞開關(guān),、標(biāo)志,、名字等控制信息,明顯的控制選擇另一個(gè)模塊的功能 外部耦合: 都訪問(wèn)一個(gè)java的內(nèi)置數(shù)據(jù)類型的全局變量 公共耦合: 都訪問(wèn)了一個(gè)公共代碼塊( 全局?jǐn)?shù)據(jù)結(jié)構(gòu),、公共通訊區(qū)、內(nèi)存公共覆蓋區(qū)等) 內(nèi)容耦合: 一個(gè)模塊直接修改另外一個(gè)模塊的數(shù)據(jù),。
降低耦合度的方法
少用類繼承,,多用類接口隱藏實(shí)現(xiàn)細(xì)節(jié) 模塊功能盡量單一 拒絕重復(fù)代碼 盡量不使用全局變量(Android中的全局變量會(huì)有一些坑,因?yàn)锳ttach在ClassLoader上的,,因此根據(jù)不同ROM的優(yōu)化,,可能會(huì)在未預(yù)料的情況被unload,導(dǎo)致數(shù)據(jù)丟失) 類成員變量與方法少用public,,多用private 盡量不用硬編碼(如 字符串放到 res/string.xml,,SQL語(yǔ)句做一層基于業(yè)務(wù)的封裝供上層使用) 使用設(shè)計(jì)模式,盡量讓模塊間的耦合關(guān)系保證在數(shù)據(jù)耦合或更弱
2. 原則匯總
使用組合而非繼承的場(chǎng)景:
優(yōu)先使用對(duì)象組合,,而非繼承
Has-A的關(guān)系,,而非Is-A的關(guān)系 子類的主要目的是拓展父類,,而非override或final,如果存在大量這種情況,,改用組合 引入工具類,,而非繼承自工具類 有可能或不確定 子類 有可能被替換為 另外一個(gè)類的子類的情況 ( 如果出現(xiàn)這種情況,就需要修改,。因此還不如使用 組合,,如果有類似需求,再 組合如新的對(duì)象,,進(jìn)行拓展即可)
繼承需要注意
當(dāng)已經(jīng)選擇使用繼承時(shí),,需要注意
實(shí)現(xiàn)抽象方法,拓展新的特性方法,,盡量少的重載父類非抽象方法 重載父類非抽象方法時(shí): 方法前置條件(方法形參)要比父類方法更寬松,,方法后置條件(方法返回值)要比父類更嚴(yán)格
類之間的關(guān)系與UML表示
常見的模式
1. MVC 與 MVP
From http://msdn.microsoft.com/en-us/library/ff647859.aspx
MVP(Model-View_Presenter)是MVC(Model-View_Controller)的一個(gè)子集。
MVC中Controller控制全局事務(wù),,View將事件發(fā)送給Controller,,Controller處理完事件同步給Model(數(shù)據(jù)庫(kù)/數(shù)據(jù)模型),View是通過(guò)所綁定的Model的改變來(lái)刷新自己,。 MVP中Presenter從View中獲取數(shù)據(jù),,刷新Model,當(dāng)Model中的數(shù)據(jù)發(fā)生改變后,,Presenter讀取Model并刷新View,。
2. MVVM
MVVM(View<->ViewModel->Model)->
在Android中可以通過(guò)DataBinding,直接在Layout文件中綁定其ViewModel,。
3. MVVM-C
MVVM-C(View-ViewModel-Callback-Model)
View: 布局 Callback: 通常可以是Fragment或Activity,,用于處理用戶交互(監(jiān)聽View布局中的用戶Action) ViewModel: 顯示數(shù)據(jù)(監(jiān)聽Model中的數(shù)據(jù)變化進(jìn)行顯示) Model: 存儲(chǔ)內(nèi)容
設(shè)計(jì)模式
1. 工廠方法模式
2. 單例模式
Initialization-on-demand holder idiom
Wiki 性能高,,線程安全 基于JVM Class Loader保證Class唯一性線程安全的模型
3. 建造者模式
與工廠模式區(qū)別是: 工廠模式關(guān)注構(gòu)建單個(gè)類型類型;建造者模式關(guān)注構(gòu)建符合類型對(duì)象,。
4. 原型模式
當(dāng)前對(duì)象對(duì)外提供拷貝方法
淺拷貝
除了基本數(shù)據(jù)類型外,,其他類型的對(duì)象都只持有當(dāng)前對(duì)象的引用,而非重新創(chuàng)建拷貝
Java中的Object#clone
Object#clone()就已經(jīng)提供了該對(duì)象的淺拷貝 如果需要使用Object#clone,需要類實(shí)現(xiàn)Clonable這個(gè)接口,,來(lái)申明該類對(duì)象支持拷貝,,否則會(huì)拋CloneNotSupportedException, 如果對(duì)象中存在隊(duì)列成員變量,隊(duì)列也需要實(shí)現(xiàn)Clonable
深拷貝
所有成員變量都將重新創(chuàng)建
方式一:
直接序列化(Java中基于JVM層級(jí)最簡(jiǎn)單的讓對(duì)象支持序列化的方式,,實(shí)現(xiàn)Serializable),,拷貝二進(jìn)制流。
方式二(推薦):
基于Object#clone()將非基本數(shù)據(jù)類型以外的元素都實(shí)現(xiàn)深拷貝,,挨個(gè)深拷貝返回,。
5. 適配器模式
6. 裝飾模式
7. 代理模式
8. 外觀模式
9. 橋接模式
10. 組合模式
11. 享元模式
12. 策略模式
13. 模板方法模式
14. 觀察者模式 (未完待續(xù))
|