【正文】
都是一個(gè) Activity。 業(yè)務(wù)邏輯層:專門完成業(yè)務(wù)邏輯的處理。常用來對 表 現(xiàn) 層 傳入 的數(shù)據(jù)進(jìn)行 業(yè)務(wù)邏輯 處理。為了完成某個(gè)業(yè)務(wù)功能,它可能會跟多個(gè)數(shù)據(jù)訪問對象 DAO打交道。 使用 POJO類來實(shí)現(xiàn)。 通常由業(yè)務(wù)服務(wù) Service類和業(yè)務(wù)實(shí)體類 Entity組成。 數(shù)據(jù)持久層:該層次專著于數(shù)據(jù)持久化邏輯的實(shí)現(xiàn),將 內(nèi)存 數(shù)據(jù)模型(如實(shí)例化對象)轉(zhuǎn)換為持久化的存儲模型數(shù)據(jù)(數(shù)據(jù)庫 記錄),也可將持久的存儲模型數(shù)據(jù)轉(zhuǎn)換為內(nèi)存數(shù)據(jù)模型。 系統(tǒng)架構(gòu)的層次圖如下所示: 圖 3– 1 系統(tǒng)架構(gòu)層次圖 一個(gè)具有良好用戶體驗(yàn)的系統(tǒng),需要優(yōu)秀的邊界類提供給參與者,使參與者能夠與系統(tǒng)進(jìn)行良好的交互 ,并且獲取參與者錄入的數(shù)據(jù) ,反應(yīng) 觸發(fā)的事件 并將結(jié)果反饋第 3章 系統(tǒng)設(shè)計(jì) 30 給參與者 。 在 Android應(yīng)用中,邊界類主要以 Activity界面類來表示。 在 系 統(tǒng)的 表示層 中 添加以下邊界類: 系統(tǒng) 主頁 邊界類、記賬 界面 邊界類、 明細(xì)查詢界面邊界類、統(tǒng)計(jì)報(bào)表界面邊界類、 數(shù)據(jù)管理界面邊界類、基礎(chǔ)設(shè)置界面邊界類等。 系統(tǒng)主界面顯示 本日支出和本月支出,以及進(jìn)行支出、收入、轉(zhuǎn)賬和借貸的記賬按鈕,底部工具欄顯示進(jìn)入其他界面的按鈕。 圖 3– 2 系統(tǒng)首頁界面邊界類 記賬界面由 4個(gè) Tab選項(xiàng)卡組成,用戶可分別通過選項(xiàng)卡來選擇進(jìn)行支出、收入、轉(zhuǎn)賬和 借貸四種賬目的記錄,每個(gè)選項(xiàng)卡具有符合各賬目類型的輸入框和下拉菜單,并驗(yàn)證用戶錄入數(shù)據(jù)的合法性,最后將數(shù)據(jù)傳遞至業(yè)務(wù)層進(jìn)行業(yè)務(wù)邏輯的處理。 圖 3– 3 記賬界面邊界類 在第二章的分析模型中,對系統(tǒng)中的概念類進(jìn)行了分析,在設(shè)計(jì)階段,需要 在概念類的基礎(chǔ)上設(shè)計(jì)出實(shí)體類。 實(shí)體類是系統(tǒng)的重要組成部分,系統(tǒng)的大部分功能都是通過實(shí)體類來傳遞信息與數(shù)據(jù)的, 所以實(shí)體類 往往 需要 進(jìn)行持久化。 根據(jù)系統(tǒng)功能需求,分析得出“用戶”、“賬目”、“收入”、“支出”、“轉(zhuǎn)賬”、“借貸”、“賬戶”等類是需要進(jìn)行持久化的 實(shí)體類 。 對各個(gè) 實(shí)體類,進(jìn)行屬性和方法的添加, 進(jìn)行實(shí)體類圖的繪制, 由于每個(gè)實(shí)體類都具有若干的 private私有屬性,因此也具有每個(gè)私有屬性對應(yīng)的 getter與 setter方法 以 供外部類調(diào)用,為了使類圖的簡潔明了的體現(xiàn)重要的核心屬性和方法,因此 類圖中并未將屬性的 getter、setter的方法 畫出 。 得到的實(shí)體類圖如下所示: 用戶記賬界面 b o u n d a r y 用戶系統(tǒng)首頁 b o u n d a r y 第 3章 系統(tǒng)設(shè)計(jì) 31 圖 3– 4 實(shí)體類圖 (1) 系統(tǒng)輸入設(shè)計(jì): 輸入內(nèi)容: 賬目金額、 記賬日期、關(guān)聯(lián)賬戶、 賬目備注、 賬目搜索條件、報(bào)表統(tǒng)計(jì)條件 、 收入支出類別信息 、賬戶信息、借貸賬戶信息 等。 輸入方式: 通過觸摸屏的手勢操作 文本框 的輸入和 下拉菜單的選擇 輸入設(shè)備:觸摸屏、軟鍵盤、 手指 (2) 系統(tǒng)輸出設(shè)計(jì): 輸出內(nèi)容:賬目信息、賬戶信息、報(bào)表統(tǒng)計(jì)結(jié)果 、賬目明細(xì) 、收入支出類別信息、接待人賬戶信息等。 輸出方式: 滾動列表、柱狀圖、折線圖 輸出設(shè)備:顯示屏 (3) 人機(jī)界面設(shè)計(jì) 系統(tǒng)首頁界面設(shè)計(jì): 首頁界面的頂部有 一標(biāo)題欄,正中位置顯示本系統(tǒng)的名稱“ iFinance”,其最右端有一循環(huán)箭頭圖標(biāo),點(diǎn)擊此圖標(biāo)可將手機(jī)上的數(shù)據(jù)同步至服務(wù)器端的 Web版 的 個(gè)人記賬系統(tǒng); 標(biāo)題欄下方,是簡要的收入、支出統(tǒng)計(jì),分別為本日、本周、本月三個(gè)時(shí)期 的收入和支出金額統(tǒng)計(jì),讓用戶在首頁就能簡要了解自己的近期收入、支出的金額 ; 再下方是四個(gè)功能按鈕,分別為“新增支出”、“新增收入”、“新增轉(zhuǎn)賬”、“新增借貸”,用戶只要點(diǎn)擊這些按鈕,就能進(jìn)入相應(yīng)的記賬界面 ; 最底部是快速工具欄 ,包括“首頁”、“明細(xì)”、“報(bào)表”、“數(shù)據(jù)”、“設(shè)置”等五個(gè)菜單項(xiàng) ,點(diǎn)擊相應(yīng) 的菜單項(xiàng)即可進(jìn)入相應(yīng)界面。 系統(tǒng)首頁界面設(shè)計(jì)如 圖 3– 2所示: 第 3章 系統(tǒng)設(shè)計(jì) 32 設(shè) 置首 頁 數(shù) 據(jù)報(bào) 表明 細(xì)新 增 支 出新 增 收 入新 增 轉(zhuǎn) 賬 新 增 借 貸i F i n a n c e今 天本 周本 月+ ¥ 3 0 0+ ¥ 3 0 0+ ¥ 3 0 0 ¥ 1 0 0 ¥ 1 0 0 ¥ 1 0 02 0 1 2 年 5 月 2 4 日5 月 2 1 日 5 月 2 7 日5 月 0 1 日 5 月 3 1 日 圖 3– 5 系統(tǒng)首頁人機(jī)界面設(shè)計(jì) 新增賬目 界面設(shè)計(jì): 界面頂部為標(biāo)題欄“新增賬目”,標(biāo)題欄下方是由 4個(gè) Tab選項(xiàng)卡組件組成的組合頁面, 分別為“支出”、“收入”、“轉(zhuǎn)賬”和“借貸”記錄界面, 用戶可根據(jù)選項(xiàng)卡進(jìn)行所需記賬賬目類型的選擇進(jìn)入相應(yīng)的記賬界面 。每個(gè) 選項(xiàng)卡所包含的用戶數(shù)據(jù)錄入域各不相同,例如“支出”界面,包含“金額”、“支出類別”、“時(shí)間”、“賬戶”和“備注”等五個(gè)輸入域(文本域和選擇菜單)。 選項(xiàng)卡組件下方,是“保存”和“返回”按鈕,分別完成賬目保存和撤銷功能,二者在完成時(shí)間響應(yīng)之后,都將返回至系統(tǒng)首頁界面。 新增賬目界面的設(shè)計(jì)如 圖 3– 3所示: 第 3章 系統(tǒng)設(shè)計(jì) 33 設(shè) 置首 頁 數(shù) 據(jù)報(bào) 表明 細(xì)保 存轉(zhuǎn) 賬收 入 借 貸支 出1 0 0 . 0 0餐 飲 午 餐2 0 1 2 5 2 4 1 2 : 0 5小 雞 燉 蘑 菇現(xiàn) 金新 增 賬 目金 額類 別時(shí) 間備 注賬 戶 圖 3– 6 新 增賬目人機(jī)界面設(shè)計(jì) 類 圖 通過 概念類 的分析,以及邊界類、實(shí)體類的設(shè)計(jì), 對系統(tǒng)中的業(yè)務(wù)邏輯層的Service服務(wù)類和數(shù)據(jù)訪問層的 DAO接口以及實(shí)現(xiàn)類進(jìn)行設(shè)計(jì)。 首先,在數(shù)據(jù)訪問層中定義了一個(gè) IBaseDao公共 基礎(chǔ)接口, 在此接口中定義了 基本的 CRUD方法 聲明 ,例如: add(T entity)、 update(T entity)、 delete(Serializable id)、 get(Serializable id)、 getAll()等。 然后,定義了一個(gè) BaseDaoImpl類實(shí)現(xiàn)IBaseDao接口, 并實(shí)現(xiàn)所有聲明的方法。 其類圖如 圖 3– 7所示: 圖 3– 7 數(shù)據(jù)訪問層基礎(chǔ)接口和實(shí)現(xiàn)類 有了基礎(chǔ)接口和基礎(chǔ)實(shí)現(xiàn)類,以后每一個(gè)需要持久化的實(shí)體類需要增加相應(yīng)的 DAO第 3章 系統(tǒng)設(shè)計(jì) 34 接口和 DAO實(shí)現(xiàn)類的時(shí)候,只需要將其 DAO接口繼承自 IBaseDao, DAO實(shí)現(xiàn)類實(shí)現(xiàn) 其 DAO接口并繼承自 BaseDaoImpl就可以了,在沒有復(fù)雜業(yè)務(wù)邏輯的情況下,甚至不用寫任何額外的屬性和方法 ,例如,“ 賬戶 ”相關(guān)的 DAO接口和實(shí)現(xiàn)類的類圖結(jié)構(gòu),如 圖 3– 8所示 (為省略空間此處不再顯示 IBaseDao和 BaseDaoImpl的屬性和方法) : I B a s e D a o I n t e r f a c e B a s e D a o I m p lI A c c o u n t D a o I n t e r f a c e A c c o u n t s D a o I m p l 圖 3– 8 賬戶 DAO接口和實(shí)現(xiàn)類 不僅僅是“賬戶” Account實(shí)體類的 DAO接口以及實(shí)現(xiàn)類是這樣的 泛化 關(guān)系, 只要是需要進(jìn)行持久化的持久類,都統(tǒng)一使用這樣的泛化關(guān)系,其余的 DAO接口以及實(shí)現(xiàn)類的類圖就不一一畫出。 對于業(yè)務(wù)邏輯層中的 Service類, 定義了一個(gè) BaseService基礎(chǔ)服務(wù)類 , 在此 基礎(chǔ)類 中 定義了一個(gè) IBaseDao類型的屬性 dao,并 定義了基本的 CRUD方法 ,例如: add(T entity)、 update(T entity)、 delete(Serializable id)、 get(Serializable id)、getAll()等 方法,這些方法均是通過調(diào)用 IBaseDao中的 CRUD方法來是實(shí)現(xiàn)的。 需要注意 的 是 , 屬 性 dao 的 具 體 實(shí) 現(xiàn) 類 由 BaseService 的 子 類 來 決 定 , 通 過 調(diào) 用(dao : IBaseDao)方法。 基礎(chǔ)服務(wù)類 BaseService的類圖,如 圖 3– 9所示: 圖 3– 9 基礎(chǔ)業(yè)務(wù)服務(wù)類的類圖 每一個(gè)實(shí)體類都應(yīng)該對應(yīng)一個(gè)屬于自身類型的 Service服務(wù)類,且均繼承自BaseService基礎(chǔ)服務(wù)類。 因?yàn)樵?BaseService類中都已經(jīng) 實(shí)現(xiàn)了基本的 CRUD方法,因第 3章 系統(tǒng)設(shè)計(jì) 35 此一般無復(fù)雜業(yè)務(wù)的情況下,實(shí)體類對應(yīng)的 Service類都不用在自定義方法,十分方便, 充分利用了 Java面向?qū)ο笳Z言的代碼復(fù)用性。 例如,收入 Ine實(shí)體類與IneService類、 IneDao接口關(guān)聯(lián)的類圖,如 圖 3– 10所示: 圖 3– 10 收入實(shí)體類相關(guān)聯(lián)類圖 根據(jù)上述對邊界類、業(yè)務(wù)邏輯層的 Service類以及數(shù)據(jù)訪問層的 DAO接口及實(shí)現(xiàn)類的分析, 對各個(gè)實(shí)體類對應(yīng)的邊界類、 Service類和 DAO接口及實(shí)現(xiàn)類 設(shè)計(jì)屬性和 方法之后,進(jìn)行 系 統(tǒng) 類圖的重新繪制, 如 圖 3– 11和 圖 3– 12所示: 第 3章 系統(tǒng)設(shè)計(jì) 36 圖 3– 11 重新繪制的類圖 1 第 3章 系統(tǒng)設(shè)計(jì) 37 圖 3– 12 重新繪制的類圖 2 在 系統(tǒng)各種類型的 類的屬性和方法都添加 了之后,需要對 分析 模型中 的順序 圖 進(jìn)行細(xì)化, 使得消息和職責(zé)在順序 圖中得到良好的體現(xiàn), 并且將邊界類和控制類添加到順序圖中,使對用例的事件流有更為直觀的描述 。 “支出管理”用例包括:新增支出、編輯支出和刪除支出。 “新增支出” : 用戶首先進(jìn)入系統(tǒng)的新增支出界面, 根據(jù)頁面 UI組件的提示來錄入相關(guān)數(shù)據(jù) , 其 中 有 一 級 支 出 類 別 , ExpenseActivity 邊界類通過getParentExpenseCategory()方法獲取 ParentExpenseCategory對象 ; 而二級支出類別是在一級支出類別的基礎(chǔ)上關(guān)聯(lián)獲取的, 通過 ParentExpenseCategory對象的getSubExpenseCategory()方法 ;同理通過 getAccount()方法獲取 Account對象;ExpenseActivity邊界類再將用戶錄入的各數(shù)據(jù)進(jìn)行驗(yàn)證、封裝成為 Expense支出對象,通過 ExpenseService的 add(expense : Expense)方法將 Expense對象持久化;ExpenseService繼續(xù)調(diào)用 IExpenseDao的 add(expense : Expense)方法將 Expense對象存第 3章 系統(tǒng)設(shè)計(jì) 38 入數(shù)據(jù)庫中。 其順序圖如 圖 3– 13所示: : U s e r : E x p e n s e A c t iv it ye x p e n s e : P a r e n t E x p e n s e C a t e g o r y : S u b E x p e n s e C a t e g o r y : A c c o u n t : E x p e n s e : E x p e n s e S e r v ic e : I E x p e n s e D a o : M a in A c t iv it ya d d E x p e n s ec r e a t eg e t P a r e n t E x p e n s e C a t e g o r y ( )g e t S u b E x p e n s e C a t e g o r y ( )s u b E x p e n s e C a t e g o r ya d d ( e x p e n s e : E x p e n s e )e x p e n s ea d d ( e x p e n s e : E x p e n s e )g e t A c c o u n t ( )a c c o u n tu p d a t e E x p e n s ee x p e n s e : = g e t E x p e n s e ( )e x p e n s e : = g e t E x p e n s e ( )e x p e n s ee x p e n s eg e t P a r e n t E x p e n s e C a t e g o r y ( )g e t S u b E x p e n s e C a t e g o r y ( )g e t A c c o u n t ( )u p d a t e E x p e n s e ( e x p e n s e : E x p e n s e )u p d a t e E x p e n s e ( e x p e n s e : E x p e n s e )s u c c e s ss u c c