作業(yè)5(單一職責(zé)&開放閉合)
作業(yè)5(單一職責(zé)&開放閉合)
1,簡述單一職責(zé)原則的優(yōu)點(diǎn),并舉例說明什么是單一職責(zé)原則?
單一職責(zé)原則是面向?qū)ο笤O(shè)計(jì)中的一個(gè)重要原則,也被稱為SRP原則。它的核心思想是一個(gè)模塊/類/函數(shù)只負(fù)責(zé)一項(xiàng)職責(zé),即一個(gè)模塊/類/函數(shù)只有一個(gè)引起它變化的原因。這樣可以使代碼更加高內(nèi)聚、低耦合,易于維護(hù)和擴(kuò)展,并且可以提高代碼的可讀性和可維護(hù)性。
舉一個(gè)簡單的例子:一個(gè)計(jì)算器類應(yīng)該只有計(jì)算的功能,而不應(yīng)該包括界面展示的功能。如果將界面展示的功能也加入到計(jì)算器類中,那么當(dāng)界面展示需要變化時(shí),就不得不修改計(jì)算器類的代碼,違反了單一職責(zé)原則。
另一個(gè)例子是一個(gè)日志類,它只應(yīng)該負(fù)責(zé)記錄日志,而不應(yīng)該同時(shí)負(fù)責(zé)發(fā)送郵件或者短信通知。如果將發(fā)送郵件或短信的功能也加入到日志類中,那么當(dāng)發(fā)送方式需要變化時(shí),就不得不修改日志類的代碼,也違反了單一職責(zé)原則。
總之,單一職責(zé)原則是面向?qū)ο笤O(shè)計(jì)中的一個(gè)重要原則,它可以使代碼更加高內(nèi)聚、低耦合、易于維護(hù)和擴(kuò)展,并且可以提高代碼的可讀性和可維護(hù)性。
2,Sunny軟件公司開發(fā)的CRM系統(tǒng)可以顯示各種類型的圖表,如餅狀圖、柱狀圖等。該系統(tǒng)持續(xù)改進(jìn),用戶希望能夠支持更多類的圖表顯示方式,例如增加LineChart,利用開放閉合原則優(yōu)化如下類的設(shè)計(jì)。
可以采取以下設(shè)計(jì)方案:
1. 定義一個(gè)抽象的圖表類 Chart,其中包含一個(gè)抽象的 display() 方法用于顯示圖表。
2. Chart 類的子類分別表示不同類型的圖表,例如 PieChart、BarChart、LineChart 等,它們實(shí)現(xiàn)了父類 Chart 的 display() 方法。
3. 如果要增加新類型的圖表,只需要定義一個(gè)新的子類,并實(shí)現(xiàn) display() 方法即可,不需要修改現(xiàn)有的代碼。
這樣,當(dāng)用戶需要新的圖表類型時(shí),只需增加相應(yīng)的子類,而不是修改已有的代碼,符合開放-封閉原則,也提高了系統(tǒng)的可維護(hù)性和擴(kuò)展性。
3,簡述開放閉合原則的核心,并舉例說明如何使用開放閉合原則優(yōu)化類的設(shè)計(jì)。
開放閉合原則是面向?qū)ο笤O(shè)計(jì)中重要的設(shè)計(jì)原則之一,其核心思想是對擴(kuò)展開放,對修改關(guān)閉。這意味著一個(gè)類的設(shè)計(jì)應(yīng)該可以方便地?cái)U(kuò)展功能,而不需要修改原有的代碼。
一個(gè)常見的例子就是計(jì)算器程序。假設(shè)我們有一個(gè)計(jì)算器程序,其中包含加減乘除四個(gè)操作。現(xiàn)在,我們需要新增一個(gè)求平方的操作。如果我們不遵循開放閉合原則,很可能需要修改原有代碼,甚至在每個(gè)操作中都要添加一個(gè)平方操作。這會導(dǎo)致代碼維護(hù)的困難,也會增加出錯(cuò)的風(fēng)險(xiǎn)。
優(yōu)化類的設(shè)計(jì)可以遵循開放閉合原則,可以采用策略模式或者工廠模式來實(shí)現(xiàn)。我們可以為每個(gè)操作定義一個(gè)接口,然后通過實(shí)現(xiàn)類來具體實(shí)現(xiàn)每個(gè)操作。這樣,當(dāng)我們需要新增一個(gè)操作時(shí),只需要實(shí)現(xiàn)新的操作接口即可,不需要修改原有代碼。同時(shí),也可以通過工廠模式來動態(tài)實(shí)例化具體的操作類,進(jìn)一步實(shí)現(xiàn)開放閉合原則。這樣做的好處是,當(dāng)我們需要添加新的操作時(shí),只需要新增操作類并實(shí)現(xiàn)操作接口即可,不需要修改原有的代碼。
4,某基于Java的C/S系統(tǒng)的登錄功能通過如下類實(shí)現(xiàn),請分析類的組成,并利用單一職責(zé)原則對其重構(gòu)
由于沒有給出具體的登錄功能實(shí)現(xiàn)代碼,無法直接分析類的組成。但是,根據(jù)常規(guī)的C/S系統(tǒng)設(shè)計(jì),登錄功能通常涉及到前端界面(如登錄界面)和服務(wù)器端的處理(如驗(yàn)證用戶賬號密碼),因此可以初步將其分為兩部分:前端和后端。
前端部分可以抽象出一個(gè)LoginView類,主要包含登錄界面的UI設(shè)計(jì)和用戶輸入的信息獲取。該類負(fù)責(zé)展示并獲取用戶輸入的信息,但不應(yīng)該處理輸入信息的驗(yàn)證和登錄操作。
后端部分可以抽象出一個(gè)LoginService類,負(fù)責(zé)處理用戶登錄請求。該類應(yīng)該包括對用戶輸入信息的驗(yàn)證和登錄狀態(tài)的確認(rèn),并將登錄狀態(tài)返回給前端。但不應(yīng)該涉及UI界面和用戶輸入信息的處理。
根據(jù)單一職責(zé)原則,一個(gè)類應(yīng)該只有一個(gè)職責(zé),不能承擔(dān)過多的職責(zé)。因此,建議將前端的UI設(shè)計(jì)和用戶輸入信息的獲取分離出來,由LoginView類負(fù)責(zé);將用戶登錄請求的處理分離出來,由LoginService類負(fù)責(zé)。這樣可以提高代碼的可維護(hù)性和可讀性,同時(shí)也有利于代碼的單元測試。
5,利用Java代碼實(shí)現(xiàn)單一職責(zé)原則課堂Book案例。
public class Book {
? ?private String name;
? ?private String author;
? ?private String publisher;
? ?private int pageCount;
? ?private double price;
? ?public Book(String name, String author, String publisher, int pageCount, double price) {
? ? ? ?this.name = name;
? ? ? ?this.author = author;
? ? ? ?this.publisher = publisher;
? ? ? ?this.pageCount = pageCount;
? ? ? ?this.price = price;
? ?}
? ?public String getName() {
? ? ? ?return name;
? ?}
? ?public String getAuthor() {
? ? ? ?return author;
? ?}
? ?public String getPublisher() {
? ? ? ?return publisher;
? ?}
? ?public int getPageCount() {
? ? ? ?return pageCount;
? ?}
? ?public double getPrice() {
? ? ? ?return price;
? ?}
}
public interface BookPersistence {
? ?void save(Book book, String filename);
}
public class FileBookPersistence implements BookPersistence {
? ?@Override
? ?public void save(Book book, String filename) {
? ? ? ?// 將Book對象保存在文件中
? ?}
}
public class DatabaseBookPersistence implements BookPersistence {
? ?@Override
? ?public void save(Book book, String filename) {
? ? ? ?// 將Book對象保存在數(shù)據(jù)庫中
? ?}
}
public interface BookPrinter {
? ?void print(Book book);
}
public class ConsoleBookPrinter implements BookPrinter {
? ?@Override
? ?public void print(Book book) {
? ? ? ?// 在控制臺上打印Book對象的信息
? ?}
}
public class WebBookPrinter implements BookPrinter {
? ?@Override
? ?public void print(Book book) {
? ? ? ?// 在web頁面上打印Book對象的信息
? ?}
}
在上述代碼中,Book類表示一本書,它只包含一本書的基本信息,例如書名、作者、出版商、頁數(shù)和價(jià)格。這遵循了單一職責(zé)原則,即每個(gè)類應(yīng)該只有一個(gè)職責(zé)。BookPersistence和BookPrinter接口分別表示將書籍信息保存到不同介質(zhì),以及將書籍信息打印到不同設(shè)備上。FileBookPersistence和DatabaseBookPersistence類分別表示將書籍信息保存到文件和數(shù)據(jù)庫中。ConsoleBookPrinter和WebBookPrinter類分別表示將Book對象打印到控制臺和Web頁面上。這些類的分離允許它們