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