C++建模實(shí)戰(zhàn)-高考錄取系統(tǒng)報(bào)名功能
接下來(lái)就是報(bào)名了。實(shí)際的高考報(bào)名是在前一年的年底,為了簡(jiǎn)化我們移到考試之前。以下是時(shí)序圖。
Student通過(guò)調(diào)用AdmissionOffice的registerStudent方法來(lái)實(shí)現(xiàn)報(bào)名。如果成功會(huì)返回一個(gè)考生號(hào)。Student會(huì)將這個(gè)考生號(hào)保存在數(shù)據(jù)成員m_id中以備將來(lái)使用。以下這部分功能的類(lèi)圖。
上圖中,StudentManager作為AdmissionOffice的一部分(組合關(guān)系,關(guān)注實(shí)心菱形)而存在,它的主要職責(zé)是負(fù)責(zé)管理高考報(bào)名信息。以下是register的主要處理內(nèi)容:
檢查是否允許報(bào)名。比如重復(fù)報(bào)名(等),如果檢查不能通過(guò)則處理終止并返回失敗。
生成唯一的考生號(hào),并與考生信息一起保存。
返回成功并通知考生號(hào)碼。
目前StudentManger的功能只有一個(gè)報(bào)名,將來(lái)還要負(fù)責(zé)查詢(xún)工作。它的功能將會(huì)隨著各種流程的深入而不斷加強(qiáng)。
只要定義好角色,不一定要馬上就把所有的方法一次定義完全。
值得注意的是AdmissionOffice沒(méi)有進(jìn)行任何處理而是直接將登陸請(qǐng)求轉(zhuǎn)發(fā)給StudentManger類(lèi)。這么做的原因就是AdmissionOffice功能太多,太復(fù)雜了。所以將它的功能分配給多個(gè)下級(jí)模塊,而本身只留下信息轉(zhuǎn)接的功能。外面的利用者都是和AdmissionOffice進(jìn)行交互,不用關(guān)注內(nèi)部真正的功能模塊。
這種結(jié)構(gòu)就是Facade設(shè)計(jì)模式。
如果你比較細(xì)心,應(yīng)該已經(jīng)看到StudentManager繼承于QMap
你猜對(duì)了,這樣做是為了利用QMap的功能來(lái)管理考號(hào)和考生的對(duì)應(yīng)關(guān)系。其實(shí)這是一個(gè)私有繼承,它的好處就是:允許StudentManger可以方便地利用QMap的功能,同時(shí)又可以防止外部的利用者使用。
私有繼承就是不告訴你孩子親爹是誰(shuí)!讓你找不著!
但是你又說(shuō)了,線(xiàn)上也看不出來(lái)是私有繼承???這里確實(shí)有點(diǎn)小遺憾,EA是通過(guò)屬性決定的,就像下面這樣。
最后告訴你一個(gè)小秘密:作用域(scope)只有在派生類(lèi)的語(yǔ)言屬性指定為C++是才會(huì)表示出來(lái)。
今天你學(xué)到什么沒(méi)有?今天你練習(xí)了沒(méi)有?