- 重學(xué)Java設(shè)計模式
- 付政委(小付哥)
- 851字
- 2021-05-19 18:10:04
7.5 原型模式重構(gòu)代碼
原型模式主要解決的問題是創(chuàng)建大量的重復(fù)對象,而這里模擬的場景同樣是需要給不同的考生創(chuàng)建相同的試卷,但在創(chuàng)建過程中,這些試卷的題目不應(yīng)該每次都從數(shù)據(jù)庫或者遠程 RPC 接口中獲取。這些操作都是非常耗時的,而且隨著創(chuàng)建對象的增多,將嚴(yán)重降低創(chuàng)建效率。
另外,在解決獲取相同試卷題目的問題后,還需要將試卷的題目與答案混排。而這種混排的過程就可以使用原型模式。在原型模式中,需要的重要技術(shù)手段是復(fù)制,而在需要用到復(fù)制的類中需要實現(xiàn)implements Cloneable接口。
7.5.1 工程結(jié)構(gòu)

原型模式代碼類關(guān)系如圖7-3所示。

圖7-3
重構(gòu)后的整個工程結(jié)構(gòu)并不復(fù)雜,主要包括如下內(nèi)容:
·題目類ChoiceQuestion、AnswerQuestion被用在題庫創(chuàng)建中;
·針對每一張試卷,都會復(fù)制。復(fù)制完成后,將試卷的題目及相應(yīng)的答案混排。這里提供了工具包TopicRandomUtil。
·核心的題庫類QuestionBank主要負責(zé)將各個題目進行組裝,最終輸出試卷。
7.5.2 題目混排工具包


考題答案混排的工具包提供了實現(xiàn)混排的random方法。其核心邏輯如下:
·在混排操作方法中,首先把題目選項使用 Java 中 Collections 工具包里的shuffle方法進行混排操作;
·記錄混排后正確答案的位置key.equals(next),最終返回新的題目選項單Topic;
·混排的過程也就是把A的選項內(nèi)容給B、把B的選項內(nèi)容給 C,同時把正確答案位置標(biāo)記出來。
7.5.3 題庫復(fù)制對象類



這個類中的操作內(nèi)容主要包括以下三個方面:
·兩個 append()對各項題目的添加有點像在建造者模式中使用的方式——添加裝修材料。
·clone()的核心操作是復(fù)制對象,這里的復(fù)制不僅包括對象本身,也包括兩個集合。只有這樣的復(fù)制才能確保在操作復(fù)制對象時不影響原對象。
·混排操作在list集合中有一個方法——Collections.shuffle,可以將原有集合的順序打亂,輸出一個新的順序。這里使用此方法對題目進行混排操作。
7.5.4 初始化試卷數(shù)據(jù)


這個類的內(nèi)容就比較簡單了,主要提供對試卷內(nèi)容的模式初始化操作(所有考生的試卷一樣,但題目順序不一致)。
對外部提供創(chuàng)建試卷的方法,在創(chuàng)建的過程中使用的是復(fù)制的方式(QuestionBank) questionBank.clone();,并最終返回試卷信息。
7.5.5 測試驗證
1.單元測試

2.測試結(jié)果




從以上的輸出結(jié)果可以看到,每位考生的題目和答案都是有差異的,如圖7-4所示。

圖7-4
- iOS面試一戰(zhàn)到底
- Spring Boot開發(fā)與測試實戰(zhàn)
- ASP.NET Core 5.0開發(fā)入門與實戰(zhàn)
- Learning ArcGIS Pro 2
- 軟件架構(gòu):Python語言實現(xiàn)
- 重學(xué)Java設(shè)計模式
- C程序設(shè)計實踐教程
- Java程序設(shè)計入門
- Java SE實踐教程
- 匯編語言編程基礎(chǔ):基于LoongArch
- HTML5+CSS3+jQuery Mobile APP與移動網(wǎng)站設(shè)計從入門到精通
- Oracle 12c從入門到精通(視頻教學(xué)超值版)
- 黑莓(BlackBerry)開發(fā)從入門到精通
- HTML5+CSS+JavaScript深入學(xué)習(xí)實錄
- Learning C# by Developing Games with Unity 3D Beginner's Guide