官术网_书友最值得收藏!

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

主站蜘蛛池模板: 云霄县| 梓潼县| 灌云县| 谢通门县| 鹤山市| 青阳县| 西宁市| 墨竹工卡县| 嘉定区| 安宁市| 定陶县| 浮梁县| 巨鹿县| 敦煌市| 丹棱县| 衡水市| 玉树县| 金川县| 化州市| 合川市| 龙岩市| 吴旗县| 乌兰察布市| 兰坪| 邻水| 改则县| 循化| 瑞昌市| 德江县| 吉林市| 峡江县| 郁南县| 边坝县| 多伦县| 霍州市| 余干县| 通海县| 商水县| 浦城县| 静宁县| 迁安市|