1. 原則
1. 單一職責原則
單一職責原則获三,就一個類而言旁蔼,應(yīng)該僅有一個引起它變化的原因。
解釋:
- 如果一個類職責過多疙教,就等于把這些職責耦合在一起棺聊;
- 軟件設(shè)計正在要做的許多內(nèi)容,就是發(fā)現(xiàn)職責并把那些職責分離贞谓;
- 如果你能夠想到多于一個的動機去改變一個類躺屁,那么這個類就具有多于一個職責,就應(yīng)該考慮類的職責分離经宏;
2. 開放-封閉原則
開放-封閉原則犀暑,是說軟件實體(類驯击、模塊、函數(shù)等)應(yīng)該可以擴展耐亏,但是不可修改徊都。
解釋: - 這個原則有兩個特征,對于擴展是開放的(Open for extension)广辰,對于更改是封閉的(Close for modification)暇矫。
面對。 - 面對需求择吊,對程序的改動是通過增加新代碼進行的李根,而不是更改現(xiàn)有的代碼。
3. 依賴倒轉(zhuǎn)原則
A. 高層模塊不應(yīng)該依賴低層模塊几睛,兩個都應(yīng)該依賴抽象房轿;
B. 抽象不應(yīng)該依賴細節(jié),細節(jié)應(yīng)該依賴抽象所森。
解釋: - 要針對接口編程囱持,不要對實現(xiàn)編程。
- 依賴倒轉(zhuǎn)其實可以說是面向?qū)ο笤O(shè)計的標志焕济,用哪種語言來編寫程序不重要纷妆,如果編寫時考慮的都是對抽象編程而不是針對細節(jié)編程,即程序中所有的依賴關(guān)系都是終止于抽象類或者接口晴弃,那就是面向?qū)ο蟮脑O(shè)計掩幢,反之就是過程化設(shè)計了。
4. 里氏代換原則
子類型必須能夠替換掉它們的父類型上鞠。
解釋: - 只有當子類可以替換掉父類际邻,軟件單位的功能不受到影響時,父類才能正在被復(fù)用旗国,而子類也能夠在父類的基礎(chǔ)上增加新的行為枯怖。
單一職責原則:高內(nèi)聚注整,一個類只做它該做的事情能曾;
5. 接口隔離原則: 接口小而專,避免大而全肿轨;
6. 迪米特法則:高內(nèi)聚寿冕,低耦合;
2. 設(shè)計模式
1.創(chuàng)建型模式
- 抽象工廠模式:提供了一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口椒袍,而無須指定他們具體的類
- 建造者模式:將一個復(fù)雜對象的構(gòu)建與他的表示分離驼唱,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示
- 工廠方法模式:將類的實例化操作延遲到子類完成,即由子類來決定究竟應(yīng)該實例化哪一個類
- 單例模式:確保在系統(tǒng)中某一個類只有一個實例驹暑,而且自行實例化并向整個系統(tǒng)提供這個實例
2.結(jié)構(gòu)型模式
- 適配器模式:將一個接口轉(zhuǎn)換成客戶希望的另一個接口玫恳,從而使接口不兼容的哪些類可以一起工作
- 橋接模式:將抽象部分與他的實現(xiàn)部分分離辨赐,使他們都可以獨立的進行變化
- 裝飾模式:動態(tài)給一個對象增加一些額外的職責
- 代理模式:給某一個對象提供一個代理,并由代理對象控制對原對象的引用
3.行為型模式
- 職責鏈模式:避免請求發(fā)送者和接收者耦合在一起京办,讓多個對象都有可能接收請求掀序,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求惭婿,直到有對象處理它為止
- 迭代器模式:提供一種方法來訪問聚合對象不恭,而不用暴露這個對象的內(nèi)部表示
- 策略模式:定義一系列算法,并將每一個算法封裝在一個類中财饥,并讓它們可以相互替換换吧,策略模式讓算法獨立于使用它的客戶而變化
- 模板方法:定義一個操作中算法的骨架,而將這一些步驟延遲到子類中
3.單例模式
需要:
(1)將構(gòu)造方法私有化钥星,使其不能在類的外部通過new關(guān)鍵字實例化該類對象沾瓦。
(2)在該類內(nèi)部產(chǎn)生一個唯一的實例化對象,并且將其封裝為private static類型打颤。
(3)定義一個靜態(tài)方法返回這個唯一對象暴拄。
實現(xiàn)一:立即加載 / “餓漢模式”
“餓漢模式”的優(yōu)缺點:
優(yōu)點:實現(xiàn)起來簡單,沒有多線程同步問題编饺。
缺點:當類SingletonTest被加載的時候乖篷,會初始化static的instance,靜態(tài)變量被創(chuàng)建并分配內(nèi)存空間透且,從這以后撕蔼,這個static的instance對象便一直占著這段內(nèi)存(即便你還沒有用到這個實例),當類被卸載時秽誊,靜態(tài)變量被摧毀鲸沮,并釋放所占有的內(nèi)存,因此在某些特定條件下會耗費內(nèi)存锅论。
實現(xiàn)二:延遲加載 / “懶漢模式”
“懶漢模式”的優(yōu)缺點:
優(yōu)點:實現(xiàn)起來比較簡單讼溺,當類SingletonTest被加載的時候,靜態(tài)變量static的instance未被創(chuàng)建并分配內(nèi)存空間最易,當getInstance方法第一次被調(diào)用時怒坯,初始化instance變量,并分配內(nèi)存藻懒,因此在某些特定條件下會節(jié)約了內(nèi)存剔猿。
缺點:在多線程環(huán)境中,這種實現(xiàn)方法是完全錯誤的嬉荆,根本不能保證單例的狀態(tài)归敬。
package singletion;
/**
* @author WangXiaoeZhe
* @Date: Created in 2019/9/2 11:46
* @description:
*/
public class Singleton {
/**
* 餓漢式
*/
private static Singleton instance = new Singleton();
/* private Singleton(){}
static Singleton getInstance() {
return instance;
}*/
/**
* 懶漢式
*/
private static Singleton instence = null;
private Singleton() {
}
static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
4.JDK中的設(shè)計模式
- 單例模式:RuntimeException
- 靜態(tài)工廠:Integer a = Integer.valueOf(int or String)
- 迭代器模式:Collection.iterator()
- 適配器模式:InputStreamReader和outputStreamWriter
- 裝飾器模式:Reader 和 bufferdReader
- 代理模式: SpringAOP
- 工廠模式:SpringIoc
適配器模式:將一個接口適配到另一個接口,Java I/O中InputStreamReader將Reader類適配到InputStream,從而實現(xiàn)了字節(jié)流到字符流的準換汪茧。
裝飾者模式:保持原來的接口椅亚,增強原來有的功能。
FileInputStream 實現(xiàn)了InputStream的所有接口舱污,BufferedInputStreams繼承自FileInputStream是具體的裝飾器實現(xiàn)者什往,將InputStream讀取的內(nèi)容保存在內(nèi)存中,而提高讀取的性能慌闭。