Java設(shè)計(jì)模式中單一職責(zé)原則詳解
前言
本博主將用CSDN記錄軟件開(kāi)發(fā)求學(xué)之路上親身所得與所學(xué)的心得與知識(shí),有興趣的小伙伴可以關(guān)注博主!也許一個(gè)人獨(dú)行,可以走的很快,但是一群人結(jié)伴而行,才能走的更遠(yuǎn)!
一、介紹
單一職責(zé)原則 (SRP) 是軟件設(shè)計(jì)中的一個(gè)重要原則,它要求每個(gè)類(lèi)只負(fù)責(zé)一個(gè)職責(zé)。 如果類(lèi)A負(fù)責(zé)兩個(gè)不同職責(zé):職責(zé)1,職責(zé)2。當(dāng)職責(zé)1需求變更而改變A時(shí),可能造成職責(zé)2執(zhí)行錯(cuò)誤。
這個(gè)原則的重要性在于:
- 降低類(lèi)的復(fù)雜度,一個(gè)類(lèi)只負(fù)責(zé)一項(xiàng)職責(zé);
- 提高類(lèi)的可讀性,可維護(hù)性;
- 降低變更引起的風(fēng)險(xiǎn);
- 通常情況下,我們應(yīng)當(dāng)遵守單一職責(zé)原則,只有邏輯足夠簡(jiǎn)單,才可以在代碼級(jí)違反單一職責(zé)原則;只有類(lèi)中方法數(shù)量足夠少,可以在方法級(jí)別保持單一職責(zé)原則;
二、代碼演示
假設(shè)我們有一個(gè)名為
Customer的類(lèi),它負(fù)責(zé)管理客戶的信息和交易。 現(xiàn)在我們想要對(duì)這個(gè)類(lèi)進(jìn)行改進(jìn),讓它只負(fù)責(zé)一個(gè)職責(zé),也就是管理客戶信息和交易。 我們可以考慮采用單一職責(zé)原則,將原來(lái)的兩個(gè)職責(zé)分開(kāi),讓Customer只負(fù)責(zé)管理客戶信息,而交易職責(zé)則由另一個(gè)類(lèi)Transaction來(lái)負(fù)責(zé)。
// 客戶類(lèi),負(fù)責(zé)管理客戶信息和交易
public class Customer {
private String name;
private int age;
private List<Transaction> transactions;
public Customer(String name, int age) {
this.name = name;
this.age = age;
this.transactions = new ArrayList<>();
}
public void addTransaction(Transaction transaction) {
this.transactions.add(transaction);
}
public void removeTransaction(Transaction transaction) {
this.transactions.remove(transaction);
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public List<Transaction> getTransactions() {
return transactions;
}
}
// 交易類(lèi),負(fù)責(zé)管理交易
public class Transaction {
private String description;
private double amount;
public Transaction(String description, double amount) {
this.description = description;
this.amount = amount;
}
public String getDescription() {
return description;
}
public double getAmount() {
return amount;
}
}
// 客戶端類(lèi),演示單一職責(zé)原則的應(yīng)用
public class Client {
public static void main(String[] args) {
// 創(chuàng)建客戶對(duì)象
Customer customer = new Customer("John", 30);
// 創(chuàng)建交易對(duì)象
Transaction transaction1 = new Transaction("Buy Coffee", 10.00);
Transaction transaction2 = new Transaction("Sell Stock", 50.00);
// 添加交易到客戶對(duì)象
customer.addTransaction(transaction1);
customer.addTransaction(transaction2);
// 獲取客戶信息和交易列表
String name = customer.getName();
int age = customer.getAge();
List<Transaction> transactions = customer.getTransactions();
// 輸出客戶信息和交易列表
System.out.println("Customer name: " + name + ", age: " + age + ", transactions: " + transactions);
}
}在上面的代碼中,
Customer類(lèi)只負(fù)責(zé)管理客戶信息,它擁有了四個(gè)方法,分別是addTransaction,removeTransaction和getName,getAge。Transaction類(lèi)只負(fù)責(zé)管理交易,它擁有了兩個(gè)方法,分別是getDescription和getAmount。
Client類(lèi)演示了單一職責(zé)原則的應(yīng)用,它創(chuàng)建了一個(gè)Customer對(duì)象,并添加了兩個(gè)Transaction對(duì)象到它的Customer對(duì)象中。最后,Client類(lèi)獲取了Customer對(duì)象的Name和Transaction列表,并輸出了它們。
通過(guò)上面的示例,我們可以看到單一職責(zé)原則的應(yīng)用可以讓代碼更加簡(jiǎn)潔,易于維護(hù)和擴(kuò)展。
到此這篇關(guān)于Java設(shè)計(jì)模式中單一職責(zé)原則詳解的文章就介紹到這了,更多相關(guān)Java單一職責(zé)原則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis中如何用tinyint保存Boolean類(lèi)型
這篇文章主要介紹了mybatis中如何用tinyint保存Boolean類(lèi)型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
java 同步器SynchronousQueue詳解及實(shí)例
這篇文章主要介紹了java 同步器SynchronousQueue詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
MyBatis攔截器實(shí)現(xiàn)分頁(yè)功能實(shí)例
本篇文章主要介紹了MyBatis攔截器實(shí)現(xiàn)分頁(yè)功能實(shí)例,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。2017-04-04
解決spring cloud服務(wù)啟動(dòng)之后回到命令行會(huì)自動(dòng)掛掉問(wèn)題
這篇文章主要介紹了解決spring cloud服務(wù)啟動(dòng)之后回到命令行會(huì)自動(dòng)掛掉問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Java 讀寫(xiě)鎖實(shí)現(xiàn)原理淺析
這篇文章主要介紹了Java 讀寫(xiě)鎖實(shí)現(xiàn)原理淺析,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
redis 使用lettuce 啟動(dòng)內(nèi)存泄漏錯(cuò)誤的解決方案
這篇文章主要介紹了redis 使用lettuce 啟動(dòng)內(nèi)存泄漏錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
Java中冒泡排序的原生實(shí)現(xiàn)方法(正序與逆序)
這篇文章主要給大家介紹了關(guān)于Java中冒泡排序的原生實(shí)現(xiàn)方法(正序與逆序)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Java動(dòng)態(tài)代理和AOP應(yīng)用示例
這篇文章主要介紹了Java動(dòng)態(tài)代理和AOP應(yīng)用,結(jié)合實(shí)例形式分析了java動(dòng)態(tài)代理在AOP面向切面編程中的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-07-07
java web在高并發(fā)和分布式下實(shí)現(xiàn)訂單號(hào)生成唯一的解決方案
這篇文章主要介紹了java web在高并發(fā)和分布式下實(shí)現(xiàn)訂單號(hào)生成唯一的解決方案,需要的朋友可以參考下2017-11-11

