周 宇,趙洪達,張倩雯
(南京航空航天大學(xué) 計算機科學(xué)與技術(shù)學(xué)院,南京 211106)
軟件設(shè)計模式課程實驗教學(xué)系統(tǒng)探索①
周 宇,趙洪達,張倩雯
(南京航空航天大學(xué) 計算機科學(xué)與技術(shù)學(xué)院,南京 211106)
設(shè)計模式是軟件工程專業(yè)的重要核心課程,兼具理論性和實踐性,但其高度的抽象性給學(xué)生學(xué)習(xí)帶來較大困難.針對該課程及學(xué)生的認(rèn)知特點,設(shè)計開發(fā)了一個基于Spring框架的設(shè)計模式實驗教學(xué)系統(tǒng)-在線教務(wù)管理平臺,該系統(tǒng)采用B/S架構(gòu),綜合了多種常用設(shè)計模式,不僅展示了單個設(shè)計模式的特點,同時展示了這些設(shè)計模式在實際項目開發(fā)中的復(fù)合應(yīng)用,有助于學(xué)生加深設(shè)計模式方法學(xué)理論精髓的理解,提高實踐動手能力,從而為進一步掌握高級軟件工程知識奠定基礎(chǔ).
軟件工程;設(shè)計模式;Spring框架;教學(xué)系統(tǒng)
在軟件工程的課程體系中,設(shè)計模式有著承上啟下的特殊地位.程序設(shè)計語言和數(shù)據(jù)結(jié)構(gòu)是學(xué)習(xí)設(shè)計模式的基礎(chǔ),但是,和這類課程不同,設(shè)計模式要解決的不是功能性問題,而是要解決其軟件質(zhì)量相關(guān)非功能性的問題(如可維護性等),這就需要學(xué)生在學(xué)習(xí)時關(guān)注從功能性屬性到非功能性屬性的轉(zhuǎn)變,這個轉(zhuǎn)變對于設(shè)計模式的學(xué)習(xí)以及軟件工程思想的理解都非常關(guān)鍵,然而在筆者的教學(xué)實踐中發(fā)現(xiàn),這個思維轉(zhuǎn)變對于初學(xué)者而言有一定困難.軟件工程的所有活動都是圍繞提高軟件質(zhì)量、降低軟件開發(fā)成本而展開,大量工作都是在研究如何設(shè)計維護性良好的解決方案以應(yīng)對環(huán)境或者需求方面引入的變化,設(shè)計模式是軟件工程專業(yè)課程體系中首次關(guān)注這個問題并提出解決方案的課程,盡管是初級課程,但為學(xué)生進一步學(xué)習(xí)軟件工程中的高級知識如軟件體系結(jié)構(gòu)等奠定基礎(chǔ),同時設(shè)計模式在工業(yè)界中有著廣泛的應(yīng)用[1].因此,設(shè)計模式課程是軟件工程專業(yè)的特色和核心課程.
由于軟件工程專業(yè)初學(xué)者的思維慣性,往往認(rèn)為軟件功能性屬性重要,而忽視非功能性屬性,這個軟件設(shè)計模式教學(xué)帶來了一定的障礙.設(shè)計模式課程同時具有一定的抽象性和具體性.從軟件開發(fā)周期來看,設(shè)計模式兩端聯(lián)系著需求階段和實現(xiàn)階段,是溝通抽象設(shè)計和具體實現(xiàn)的橋梁.設(shè)計模式本身是屬于方法學(xué)的范疇,是獨立于特定的程序設(shè)計語言,它強調(diào)的是一種質(zhì)量高、魯棒性強、可復(fù)用的方案.而設(shè)計模式的落地應(yīng)用需要在代碼中體現(xiàn),需要大量依賴對象式語言中封裝、繼承、多態(tài)等機制,針對不同的上下文需求,初級設(shè)計模式課分為創(chuàng)建型、結(jié)構(gòu)型、行為型三大類共23中設(shè)計模式[2,3],每種設(shè)計模式都有它所針對的特定的問題,簡單地照本宣科講授相關(guān)的定義和實現(xiàn),學(xué)生難以消化運用,因此引入實驗教學(xué)系統(tǒng),采用理實一體化教學(xué)手段,在現(xiàn)階段的設(shè)計模式教學(xué)中非常有必要.
基于上述分析,本文設(shè)計和實現(xiàn)了面向設(shè)計模式課程實驗教學(xué)系統(tǒng)-在線教務(wù)管理平臺,該平臺采用了流行的Spring框架結(jié)構(gòu)[4],集成了多種設(shè)計模式,既可以展示設(shè)計模式的單個特點,也可以展現(xiàn)這些設(shè)計模式的復(fù)合協(xié)作,有助于學(xué)生理解設(shè)計模式思想,從而有效提高教學(xué)效果.
1.1 設(shè)計背景及思路
教務(wù)管理系統(tǒng)是教育機構(gòu)常用的一種信息管理系統(tǒng),為相關(guān)不同涉眾提供信息服務(wù),主要對象包括教師、學(xué)生以及管理員.基本的功能包括:課表的添加、修改功能,即管理員可以為每個專業(yè)的學(xué)生添加、修改課程信息,可以是必修課也可以是選修課;課表的顯示功能,即學(xué)生查看自己當(dāng)前需要進行的課程以及該課程的詳細(xì)信息,在查看該課程的同時在允許范圍內(nèi)可以對該課程進行退課等操作,可以查看已完成課程的情況,教師可以查看自己的需要準(zhǔn)備的課程,以及正在進行該課程的學(xué)生信息;成績的輸入、修改功能,即教師有權(quán)限輸入或者修改學(xué)生所選課程的成績;學(xué)分的統(tǒng)計功能,即學(xué)生可以在系統(tǒng)查看已擁有的學(xué)分,和未完成的學(xué)分,以及學(xué)分的分布情況;意見反饋功能,即學(xué)生和教師都可以通過該系統(tǒng)反饋教學(xué)意見,并且學(xué)生、教師和管理員都可以看到所有的反饋意見,并且可以進行點贊,評論等操作,并且每次點贊該反饋的重要程度就會被提高.
為實現(xiàn)以上基本功能,我們采用B/S架構(gòu),以Spring框架作為平臺基礎(chǔ),設(shè)計和實現(xiàn)了相應(yīng)的教務(wù)管理系統(tǒng),由于不同的涉眾用戶有不同的權(quán)限、視圖以及安全等方面的需求,為便于擴展,具有良好的可維護性,系統(tǒng)集成多種設(shè)計模式,設(shè)計思路如下:
(1)基于Spring框架中MVC設(shè)計模式的三層架構(gòu),分別為UI Layer(表現(xiàn)層)、DataAccess Layer(數(shù)據(jù)訪問層)和Business Layer(業(yè)務(wù)邏輯層),目的是保障系統(tǒng)的可維護性和可重用性,加強系統(tǒng)對功能領(lǐng)域的專注.
(2)基于多種設(shè)計模式來實現(xiàn)相關(guān)業(yè)務(wù)邏輯.
(3)基于角色的訪問控制機制,教務(wù)管理系統(tǒng)將會有三方人員進行訪問分別是教師、學(xué)生以及管理員.不同的人訪問教務(wù)管理系統(tǒng)將會有不同的訪問權(quán)限.
1.2 系統(tǒng)的架構(gòu)
系統(tǒng)架構(gòu)層次使用了 MVC(Model–View–Controller)模式[5].MVC模式是軟件工程中的一種經(jīng)典軟件架構(gòu)模式,把軟件系統(tǒng)分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller).控制器負(fù)責(zé)請求處理邏輯,視圖是用戶接口界面,模型部分是數(shù)據(jù)模型相關(guān)管理和數(shù)據(jù)庫設(shè)計等各種功能.本文采用MVC軟件架構(gòu)模式實現(xiàn)與用戶的交互以及后臺的數(shù)據(jù)管理,能良好的體現(xiàn)高內(nèi)聚性、低耦合性思想.
圖1 系統(tǒng)MVC架構(gòu)圖
如圖1所示,本文設(shè)計和實現(xiàn)的教務(wù)管理系統(tǒng)Spring框架下釆用基于MVC設(shè)計模式的三層架構(gòu),分別為UI Layer(表現(xiàn)層)、DataAccess Layer(數(shù)據(jù)訪問層)和Business Layer(業(yè)務(wù)邏輯層).目的是保障系統(tǒng)的可維護性和可重用性,加強系統(tǒng)對功能領(lǐng)域的關(guān)注.
根據(jù)以上的思路我們設(shè)計的面向設(shè)計模式教學(xué)實驗的教務(wù)管理系統(tǒng)結(jié)構(gòu)如圖2所示.其中,身份認(rèn)證模塊主要負(fù)責(zé)對用戶身份的甄別.系統(tǒng)通過該模塊對用戶提供的登錄憑證進行校驗,甄別用戶是否是合法的訪問主體,確定用戶是否有權(quán)進入系統(tǒng).授權(quán)訪問模塊主要負(fù)責(zé)判斷一個資源要不要給當(dāng)下的訪問者操作或者展示.這里系統(tǒng)會通過該模塊將用戶擁有的權(quán)限和請求的安全資源的權(quán)限列表進行匹配,對匹配成功的用戶授予相應(yīng)的權(quán)限,并且將資源對其開放,若匹配失敗則不具有相應(yīng)的權(quán)限,那么就通知用戶不具有相應(yīng)權(quán)限無法訪問對應(yīng)的資源.數(shù)據(jù)加密模塊主要職責(zé)為針對敏感數(shù)據(jù)進行md5加密保證數(shù)據(jù)的安全性以及可靠性.同時防止用戶利用請求完成頁面因為數(shù)據(jù)未加密而導(dǎo)致的非法跳轉(zhuǎn)的情況.同時保證了數(shù)據(jù)意外泄露的安全性.課表管理模塊,學(xué)分、成績管理模塊以及意見反饋管理模塊主要針對前文所述的功能需求,在此不做贅述.數(shù)據(jù)庫我們采用開源數(shù)據(jù)庫MySQL[6].
圖2 系統(tǒng)結(jié)構(gòu)圖
在系統(tǒng)實現(xiàn)過程中,我們?nèi)谌肓硕喾N設(shè)計模式,展示了它們在實際系統(tǒng)中的應(yīng)用,主要包括代理模式、工廠模式、策略模式、裝飾者模式、觀察者模式、組合模式、以及迭代器模式,本節(jié)主要介紹這些設(shè)計模式在該系統(tǒng)中的使用情況,由于篇幅所限,重點介紹其中較有代表性的一種設(shè)計模式-裝飾者模式的使用.
2.1 代理模式
代理模式通過使用代理對象完成用戶請求,屏蔽了用戶對真正對象的訪問.同時做到對真實對象的控制和管理訪問.
系統(tǒng)設(shè)計中,使用JDBC實現(xiàn)網(wǎng)頁前端接口與MySQL數(shù)據(jù)庫交互的時候需要創(chuàng)建數(shù)據(jù)庫連接,而每一個數(shù)據(jù)庫鏈接都有比較大的開銷,所以不到真正使用的時候沒有必要創(chuàng)建數(shù)據(jù)庫連接對象.所以這里使用的代理模式的虛擬代理.使用虛擬代理作為創(chuàng)建開銷大的對象的代表.而每一個數(shù)據(jù)表對應(yīng)的操作類都有數(shù)據(jù)庫連接,所以對每一個數(shù)據(jù)表操作類都有一個對應(yīng)的代理類.這樣只有在需要對相應(yīng)的數(shù)據(jù)表進行操作的時候才會創(chuàng)建相應(yīng)的對象,之后代理類將請求給已創(chuàng)建的對象進行數(shù)據(jù)庫操作,這樣可提高系統(tǒng)的運行效率.
在實現(xiàn)中,我們對每個數(shù)據(jù)表的操作都抽象為了一個接口如AdminDAO,然后AdminDAOimpl類是對應(yīng)接口的具體實現(xiàn),代理類AdminDAOProxy是實現(xiàn)了同樣的接口,將真正的操作傳遞給AdminDAOimpl對象并調(diào)用AdminDAOimpl中的具體操作方法,圖3展示了代理模式結(jié)構(gòu)的UML示意圖.
圖3 代理模式UML示意圖
2.2 工廠模式
工廠模式主要用于對象的創(chuàng)建,分為三種,一種是簡單工廠模式(Simple Factory Pattern).在該模式中,定義了一個類來負(fù)責(zé)創(chuàng)建其他產(chǎn)品類的實例,可以根據(jù)參數(shù)的不同返回不同類的實例.第二種是工廠方法模式(Factory Method Pattern),它屬于類創(chuàng)建型模式.在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則決定生成具體的產(chǎn)品對象,這樣類實例的創(chuàng)建就可以在子類中單獨完成.第三種是抽象工廠模式(Abstract Factory Pattern):提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們具體的類.在我們的系統(tǒng)中數(shù)據(jù)庫表越多,需要代理對象就越多.
在model層涉及到大量數(shù)據(jù)庫操作,比如登錄,添加課表等,這樣需要一個工廠類來獲得所需要的代理對象.因為系統(tǒng)僅僅是一個演示系統(tǒng),規(guī)模比較小,實現(xiàn)中我們采用簡單工程模式就可以.在需要某個代理的時候就可以根據(jù)需要創(chuàng)建相應(yīng)的代理對象.若是使用頻繁某一代理對象,可以使用單例模式減少代理對象創(chuàng)建次數(shù).
2.3 策略模式
在策略模式中,存在一系列算法,每一種方法稱之為一個策略,將每一個方法封裝起來,并讓它們可以相互替換.策略模式讓算法獨立于使用它的客戶,然后根據(jù)環(huán)境或者條件的不同選擇不同的策略來完成該項任務(wù).
在我們的系統(tǒng)中的開發(fā)中有很多情況需要用到策略模式,如意見反饋管理模塊.反饋意見分為教師意見和學(xué)生意見,都有相同的操作如意見的添加,修改等操作,但操作實現(xiàn)的時候處理略有不同.所以就采用了策略模式.另外實現(xiàn)學(xué)生教師的各自的操作(行為)即相同的操作但是有不痛的具體的實現(xiàn)方式.先實現(xiàn)關(guān)于意見反饋的操作的接口.然后實現(xiàn)學(xué)生意見和教師意見,在實現(xiàn)教師意見的時候?qū)㈥P(guān)于教師意見的操作添加進去,實現(xiàn)學(xué)生意見的時候?qū)㈥P(guān)于學(xué)生意見操作添加進去.這樣即使要修改有關(guān)操作的具體實現(xiàn)也只需要修改有關(guān)操作的類即可.下面以意見的更新操作為例,首先聲明一個意見更新的接口IUpdateSuggestionAction.然后教師和學(xué)生實現(xiàn)意見更新操作時的具體內(nèi)容并不相同,所以創(chuàng)建兩個類UpdateStuSuggestion以及UpdateTchSuggestion分別實現(xiàn)這個接口.創(chuàng)建一個類Suggestions,它擁有關(guān)于意見所有操作的方法,同時擁有所有如IUpdateSuggestionAction一樣行為接口類型的成員變量.無論是教師的意見還是學(xué)生的意見都需要實現(xiàn)這些方法,再創(chuàng)建StuSuggestion和TchSuggestion兩個類繼 承 Suggestion類 ,然 后 在 構(gòu) 造 函 數(shù) 中 將UpdateStuSuggestion以及UpdateTchSuggestion的實例賦值給對應(yīng)接口類型的成員變量,這樣在成員函數(shù)中使用成員變量就可以直接調(diào)用其相應(yīng)的行為.
2.4 裝飾者模式
裝飾者模式動態(tài)地將新的功能附加到對象上,所以若要擴展功能,裝飾者提供了比繼承更有效的方法.裝飾者模式給一個對象動態(tài)的添加新的功能,裝飾者和被裝飾者實現(xiàn)同一個接口,裝飾者持有被裝飾者的實例.
在該模式中,首先聲明一個主題接口,通過實現(xiàn)這個接口創(chuàng)建一個裝飾者類和被裝飾者類.由于實現(xiàn)了同一個接口所以擁有相同的方法,然后在裝飾者類中聲明一個主題接口類型的變量以便擁有被裝飾者對象.在裝飾者類中添加需要擴展的功能,然后在執(zhí)行接口繼承的方法的同時執(zhí)行擴展的方法,這樣相對于被裝飾者類,同樣的方法卻多出來擴展的功能.也符合上面所說的在運行的時候增加行為.
教務(wù)管理系統(tǒng)中每個學(xué)生或者教師提交的反饋意見都有點贊等功能.也就是說每次點贊后在完成其他相應(yīng)操作(記錄點贊人等操作)的同時還需要將點贊數(shù)量更新或者將該條意見的重要程度進行更新.我們將原始的點贊操作定義為一個抽象類(IUpvoteSuggestion),具體的更新重要程度的類(ImportantDecorator)和 改 變 點 贊 次 數(shù) 的 類(ChangeTimesDecorator)則繼承了公共的裝飾者類(Decorator),而 該 裝 飾 者 類 繼 承 了 抽 象 類IUpvoteSuggestion,同時與該抽象類存在組合關(guān)系.使用裝飾者模式可以較容易的擴展增加功能,比如通過對點贊操作的再一次裝飾使其擁有在記錄點贊人的同時更新點贊數(shù)據(jù)以及重要程度的功能,實現(xiàn)面向?qū)ο笾械摹皩π薷氖欠忾]的,對擴充是開放的”設(shè)計原則.圖4展示了在我們的系統(tǒng)中所采用的裝飾者模式UML類圖.
圖4 裝飾者模式UML示意圖
2.5 模式的復(fù)合使用
模式的復(fù)合主要體現(xiàn)在用戶界面相關(guān)的設(shè)計中.復(fù)合并不是簡單的將幾個設(shè)計模式組合到一起,而是更側(cè)重于解決一般性或者重復(fù)性的問題.如前所述,該系統(tǒng)設(shè)計是基于Sping框架,而該框架的重要特征是采用了MVC架構(gòu).在我們的實現(xiàn)中,復(fù)合的模式主要包括了觀察者模式、組合模式、策略模式和迭代器模式.
觀察者模式定義了對象間的一種一對多依賴關(guān)系,使得每當(dāng)一個對象狀態(tài)發(fā)生改變時,其相關(guān)依賴對象皆得到通知并被自動更新.觀察者模式也稱發(fā)布-訂閱(Publish/Subscribe)模式、源-監(jiān)聽器(Source/Listener)模式等.觀察者模式所建立的一對多的關(guān)系通常稱為一個觀察目標(biāo)對多個觀察者的關(guān)系,每當(dāng)觀察目標(biāo)獲取到新的數(shù)據(jù),即觀察目標(biāo)本身發(fā)生改變就通知其對應(yīng)的所有觀察者,然后觀察者獲取到新的數(shù)據(jù),然后跟據(jù)自身的需要進行更新,而且這些觀察者之間不存在相互依賴的關(guān)系,即可以根據(jù)需要添加觀察者以及刪除觀察者,使整個系統(tǒng)更易于擴展.
組合模式把一組相似的對象當(dāng)作一個單一的對象處理.一般而言,組合模式依據(jù)層次式的樹形結(jié)構(gòu)來管理對象,當(dāng)一組對象和單個對象執(zhí)行相同操作時便可使用組合模式,這樣可以更加方便的處理一組對象.比如XML結(jié)構(gòu)中的原子節(jié)點和復(fù)合節(jié)點可以用同樣操作進行訪問.迭代器模式相對比較簡單,它提供一種方法訪問一個容器對象中各個元素,而又不暴露該對象的內(nèi)部細(xì)節(jié),在JDK中,已經(jīng)把迭代器模式融入語法之中,針對于所有的Java容器類,都定義了相同的接口用于遍歷其中元素.
在我們的系統(tǒng)用戶界面部分實現(xiàn)中,綜合使用了上述設(shè)計模式,管理員在系統(tǒng)后臺添加專業(yè)課程后,對應(yīng)專業(yè)的學(xué)生的課表就需要更新,添加上對應(yīng)的課程.由于權(quán)限不同,每個專業(yè)的學(xué)生看到的課表也僅僅是自己專業(yè)的課表.每個專業(yè)都有自己的課表操作類來實現(xiàn)對該專業(yè)學(xué)生課表的更新.我們使用觀察者模式完成課表的更新.主題對象獲取到管理員提交的新數(shù)據(jù)便通知注冊的操作類,然后操作類開始對該專業(yè)學(xué)生課表的更新.課表的顯示視圖控件有多個,我們采用組合模式,針對不同的控件定義一個公共的父類和抽象方法,具體的顯示邏輯在控件子類中實現(xiàn),這樣我們只需按照統(tǒng)一的接口調(diào)用它們的方法,簡化了客戶端邏輯;同時,在更新操作中由于每一個專業(yè)的學(xué)生都不止一個,這樣我們將專業(yè)里的學(xué)生對象放到該專業(yè)的列表中,而對學(xué)生的遍歷操作則使用迭代器模式.在管理系統(tǒng)中的視圖和控制器兩部分剛好實現(xiàn)策略模式.視圖作為一個對象對應(yīng)主體部分來調(diào)用不同的策略,而控制器作為行為部分,具體實現(xiàn)不同的策略.在視圖中的每一個行為無論是顯示還是更新都是交給控制器來實現(xiàn)具體的操作.策略模式本身的主體和行為的解耦性也正好完成了視圖和控制器的解耦.
設(shè)計模式是軟件工程專業(yè)的特色和核心課程,對于學(xué)生掌握軟件工程思想、進一步學(xué)習(xí)架構(gòu)方面知識有著重要作用,筆者在教學(xué)實踐中,針對課程特點,設(shè)計和實現(xiàn)了一個面向設(shè)計模式實驗教學(xué)的教務(wù)管理系統(tǒng),該系統(tǒng)基于Spring框架,采用B/S架構(gòu),融合了多種設(shè)計模式,不僅展現(xiàn)了模式的單個應(yīng)用,同時也示例了若干設(shè)計模式的協(xié)作復(fù)合.從課程反饋來看,該實驗系統(tǒng)的采用可有效激發(fā)學(xué)生學(xué)習(xí)的興趣和主動性,加深理論理解程度,提高動手實踐能力,達到了預(yù)期的教學(xué)效果.
1嚴(yán)華,張欲蓉.設(shè)計模式在通訊接口設(shè)計中的應(yīng)用.計算機系統(tǒng)應(yīng)用,2012,21(5):172–175.
2 Erich G,Richard H,Ralph J,et al.Design Patterns:Elements of Reusable Object-Oriented Software.北京:機械工業(yè)出版社,2005.
3 Freeman E,Robson E,Bates B,Sierra K.Head First Design Patterns.US:O’Reilly Media,2004.
4 Johnson R,Hoeller J,Arendsen A,et al.Professional Java Development with the Spring Framework.New York:John Wiley&Sons,2009.
5劉紅霞,陸文迪.改進的MVC設(shè)計模式的研究與應(yīng)用.計算機工程與科學(xué),2015,37(9):1688–1691.
6韓兵,王照清,廖聯(lián)軍.基于MySql多表分頁查詢優(yōu)化技術(shù).計算機系統(tǒng)應(yīng)用,2016,25(8):171–175.
Teaching Platform for the Course of Software Design Patterns
ZHOU Yu,ZHAO Hong-Da,ZHANG Qian-Wen
(College of Computer Science and Technology,Nanjing University ofAeronautics and Astronautics,Nanjing 211106,China)
The course of design patterns is an important core course of software engineering.The course is characterized by both theory and applicability.But the abstract feature brings obstacles to students.According to the features of the course and the students’cognition,we design and implement a teaching platform based on Spring Framework-online education management system.The system adopts B/S architecture,and integrates multiple design patterns.It shows not only the features of individual design patterns,but also their composite application in a practical project.Thus it helps the students to have a deeper understanding of the essence theory of design patterns,enhance their programming ability and lay the foundation for them to learn more advanced knowledge in software engineering.
software engineering;design patterns;Spring framework;teaching platform
江蘇省自然科學(xué)基金(BK20151476);中央高校基本科研業(yè)務(wù)基金(NS2016093)
2016-09-02;收到修改稿時間:2016-09-29
10.15888/j.cnki.csa.005754