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