1. 開閉原則
軟件實體(class魔种,模塊析二,功能或業(yè)務(wù),微服務(wù)etc)對修改關(guān)閉,對拓展開放叶摄。
抽象構(gòu)建框架属韧,實現(xiàn)拓展細節(jié)。
面向抽象編程蛤吓,而不是面向具體實現(xiàn)編程宵喂。因為抽象相對來說是穩(wěn)定的,讓類去依賴于固定的抽象会傲,所有對于修改來說就是封閉的锅棕,通過OO的繼承,多態(tài)機制就可以實現(xiàn)對抽象體的拓展淌山,通過重寫改變固有的方法或者實現(xiàn)新的拓展方法裸燎。
2. 依賴倒置原則
高層實現(xiàn)不應(yīng)該直接依賴于低層實現(xiàn),它們應(yīng)該依賴于共同的抽象(低層接口)艾岂。
越基礎(chǔ)的模塊發(fā)生變化影響的范圍越大顺少。
案例1:三層架構(gòu)
service(高層) -> dao(低層)
service的實現(xiàn)類不應(yīng)該直接依賴于dao的實現(xiàn)類,而是應(yīng)該依賴dao的接口王浴。這樣做的好處就是在不需要修改service實現(xiàn)類和dao實現(xiàn)類的情況下脆炎,對dao的實現(xiàn)類進行拓展,符合開閉原則氓辣。
service實現(xiàn)類和dao實現(xiàn)類是解耦合的秒裕,但service實現(xiàn)類和dao接口是低耦合的,符合高內(nèi)聚低耦合钞啸。
舉例:
service實現(xiàn)類中的dao本來使用jdbc實現(xiàn)几蜻,現(xiàn)在需要使用hibernate實現(xiàn)。我們就可以在保留原來jdbc實現(xiàn)的dao体斩,通過拓展dao接口的方式梭稚,開發(fā)hibernate實現(xiàn)的dao。
- service實現(xiàn)
public class UserServiceImpl {
private UserDao userDao;
public List<User> getUserList() {
return userDao.findAll();
}
}
- 使用hibernate實現(xiàn)的dao
public class userDaoHibernateImpl {
public User findAll() {
// hibernate...
}
}
- 使用jdbc實現(xiàn)的dao
public class userDaoJdbcImpl {
public User findAll() {
// jdbc...
}
}
service實現(xiàn)類獲取dao實現(xiàn)類的一些變式:
- 方法參數(shù)絮吵。eg:
getUserList(UserDao userDao)
- 構(gòu)造器注入
- setter注入
案例2:框架原理
TODO 李智慧
3. 單一職責原則
不要存在多于一個導(dǎo)致類變更的原因弧烤。
一個類只負責一種職責,從類的方法上來考慮就是一個類可能存在多個方法蹬敲,但這些方法的功能類似暇昂,都是為了完成同一種職責。
適用于類伴嗡、接口急波、方法等,減少復(fù)雜度瘪校、提高可讀性和可維護性澄暮。
4. 接口隔離原則
該原則針對接口。要求在適度該原則的情況下,盡量細化接口(接口中的方法盡量少赏寇,完成的功能盡量單一)吉嫩,過大的接口不利于維護,過小的接口會提高系統(tǒng)的復(fù)雜性嗅定,也不利于后期維護自娩。
一個類不應(yīng)該實現(xiàn)不需要的接口方法。
細粒度可組裝渠退,粗粒度不可拆分忙迁。
高內(nèi)聚低耦合:高內(nèi)聚要求減少對外交互,使接口中最少的方法去完成最多的事情碎乃。低耦合要求降低依賴關(guān)系姊扔。
5. 迪米特原則
最少知道原則,一個對象應(yīng)對其他對象保持最少的了解梅誓。
減少類之間不必要的依賴恰梢,盡量降低類之間的耦合,提高類的復(fù)用率梗掰。
適當使用訪問權(quán)限嵌言。
該原則要求只和朋友交流,不和陌生人交流及穗。那么對于一個類來說摧茴,哪些是朋友?哪些是陌生人埂陆?
- 朋友
- 對象組合
- 對象依賴苛白。輸入?yún)?shù),輸出返回值焚虱。
- 陌生人
- 方法體內(nèi)中的類