iOS開發那些事-移動平台架構設計

來源:互聯網
上載者:User

低耦合企業級系統架構設計

我們往往稱JavaEE或.Net 開發的產品為“系統”,而移動平台(主要是:Android、iOS和Window Phone)開發的產品為“應用”。“系統”比較複雜,需要架構設計,而“應用”相對比較簡單,這是不是意味著我們不需要考慮架構問題呢?

 

我 們首先瞭解一下企業級系統架構設計。軟體設計的原則是提高軟體系統的“可複用性”和“可擴充性”,系統架構設計採用層次劃分方式,這些層次之間是 松耦合的,層次的內部是高內聚的。降低耦合是軟體設計的目標,能夠設計出低耦合的系統,就意味著我們的系統具有“可複用性”和“可擴充性”。通用低耦合 JavaEE和.Net企業級系統架構圖。

展示層是使用者與系統互動的組件集合,使用者通過這一層向系統提交請求或發出指令,系統通過這一層接收使用者請求或指令,然後,將指令消化吸收後調用下一層,再將調用的結果展現到這一層。展示層應該是輕薄的不應該具有商務邏輯。

業務層是系統的核心業務處理層,負責接收展示層的指令和資料,消化吸收後,進行組織商務邏輯的處理,並將結果返回給展示層。

資料持久層是服務層用於訪問資料庫層,從設計規範上講為了降低耦合度,服務層不應該具有訪問資料庫的代碼,訪問資料庫的代碼應該放到資料持久層中。

資訊系統層,是系統的資料來源,可以是資料庫、檔案、遺留系統和網路資料。

移動平台的分層架構設計

移動平台的應用是縮小版本的系統,它也需要架構設計,但並非所有的應用都一定基於通用低耦合企業級系統架構,一般而言主要是涉及資訊處理的應用才使用這種架構設計模式,例如:一些遊戲有自己的遊戲引擎,引擎也屬於架構設計。iOS平台一般資訊處理應用分層架構設計圖。

展示層,iOS中的展示層是由UIKit Framework構成的,它包括我們前面學習的視圖、控制器、控制項和事件處理等內容;

商務邏輯層,採用什麼架構要據具體的業務而定,但一般是具有一定業務處理功能的Objective-C和C++封裝的類,或者是C封裝的函數。

資料持久層,提供本地或網路資料訪問,它可能是訪問SQLite資料API函數,也可能是CoreData技術,或是訪問檔案的NSFileManager,或是網路通訊等技術,採用什麼方式要看資訊系統層是什麼。

資訊系統層,就iOS而言它的資訊來源分為:本地和網路。本機資料可以放入檔案中也可以放在資料庫中,目前iOS本機資料庫採用SQLite3。網路可以是某個雲端服務,也可以是一般的Web服務。

基於同一工程的分層

架 構對於我們iPhone和iPad開發有著很現實的意義。如果我們要編寫一個基於iOS(iPhone和iPad兩個平台)“My備忘錄”應用, 它具有:增加、刪除和查詢備忘錄的準系統, “備忘錄”應用使用案例圖,分層設計之後,展示層可以有不同iPhone版和iPad版本,而且商務邏輯層、數 據持久層和資訊系統層都可以公用。這樣可以大大減少我們的工作量,這就是分層設計的好處。

iOS考慮iPhone和iPad兩個平台,我們繪製了設計原型草圖, iPhone版本的“My備忘錄”應用設計原型草圖。iPad版本的“My備忘錄”橫屏設計原型草圖, iPad版本的“My備忘錄”豎屏設計原型草圖。

 

 

在iOS平台分層的具體做法有多種模式:基於同一工程的分層、基於一個工作空間不同工程的分層和靜態連結庫分層。本小節介紹基於同一工程的分層。

我 們在前文中已經介紹了構建自適應iPhone和iPad工程,就是我們現在要講的基於同一工程的分層模式。請讀“備忘錄”應用的代碼,實現過程這 裡不做介紹,開啟“MyNotes”工程,在Xcode工程導航面板有3個組:PresentationLayer、 BusinessLogicLayer和PersistenceLayer。建立這3個組的目的是把不同層中類放到對應的組中便於管 理, PresentationLayer是放置的展示層相關類,BusinessLogicLayer是放置的商務邏輯層的相關 類,PersistenceLayer是放置持久層相關類。

各 個層的下面再如何劃分呢?我們可以按照業務模組劃分,也可以按照組件功能劃分。本應用中PersistenceLayer層就還要分成dao和 domain兩個組,dao是放置Data Access Objects的,該對象中有對資料訪問的CRUD四類方法,為了降低耦合度dao一般要設計成為協議(或Java接 口),然後根據不同的資料來源採用不同的實現方式。domain組是實體類,實體是應用中的“人”、“事”、“物”等。

dao組中NoteDAO.h代碼如下:

@interface NoteDAO : NSObject//儲存資料列表@property (nonatomic,strong) NSMutableArray* listData;+ (NoteDAO*)sharedManager;//插入Note方法-(int) create:(Note*)model;//刪除Note方法-(int) remove:(Note*)model;//修改Note方法-(int) modify:(Note*)model;//查詢所有資料方法-(NSMutableArray*) findAll;//按照主鍵查詢資料方法-(Note*) findById:(Note*)model;@end

 

 

listData屬性用於儲存資料表中的資料,其中每一個元素都是Note對象,一個Note對象代表資料表中的一條資料。+ (NoteDAO*)sharedManager方法用於獲得NoteDAO單例對象。dao組中NoteDAO.m代碼如下:

@implementation NoteDAOstatic NoteDAO *sharedManager = nil;+ (NoteDAO*)sharedManager{static dispatch_once_t once;dispatch_once(&once, ^{NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];NSDate *date1 = [dateFormatter dateFromString:@"2010-08-04 16:01:03"];Note* note1 = [[Note alloc] init];note1.date = date1;note1.content = @”Welcome to MyNote.”;NSDate *date2 = [dateFormatter dateFromString:@"2011-12-04 16:01:03"];Note* note2 = [[Note alloc] init];note2.date = date2;note2.content = @”歡迎使用MyNote。”;sharedManager = [[self alloc] init];sharedManager.listData = [[NSMutableArray alloc] init];[sharedManager.listData addObject:note1];[sharedManager.listData addObject:note2];});return sharedManager;}//插入Note方法-(int) create:(Note*)model{[self.listData addObject:model];return 0;} //刪除Note方法-(int) remove:(Note*)model{for (Note* note in self.listData) {//比較日期主鍵是否相等if ([note.date isEqualToDate:model.date]){[self.listData removeObject: note];break;}}return 0;} //修改Note方法-(int) modify:(Note*)model{for (Note* note in self.listData) {//比較日期主鍵是否相等if ([note.date isEqualToDate:model.date]){note.content = model.content;break;}}return 0;} //查詢所有資料方法-(NSMutableArray*) findAll{return self.listData;} //按照主鍵查詢資料方法-(Note*) findById:(Note*)model{for (Note* note in self.listData) {//比較日期主鍵是否相等if ([note.date isEqualToDate:model.date]){return note;}}return nil;}@end

 

NoteDAO實現採用了單例設計模式,這種設計與DAO設計模式沒有關係,這主要是出於訪問資料的方便。資料放置在listData屬性中(本應該是從資料庫中的,但是資料庫訪問技術我們還沒有學習),CRUD方法也都是對listData的處理,而非資料庫。

domain組中Note代碼如下,它只有兩個屬性date是建立備忘錄的日期,content是備忘錄內容:

////  Note.h #import <Foundation/Foundation.h> @interface Note : NSObject @property(nonatomic, strong) NSDate* date;@property(nonatomic, strong) NSString* content; @end ////  Note.m#import ”Note.h” @implementation Note @end商務邏輯層BusinessLogicLayer中的類的設計一般是按照業務模組設計的,它的方法是業務處理方法,下面代碼是NoteBL.h代碼:@interface NoteBL : NSObject//插入Note方法-(NSMutableArray*) createNote:(Note*)model; //刪除Note方法-(NSMutableArray*) remove:(Note*)model; //查詢所有資料方法-(NSMutableArray*) findAll; @end

 

在NoteBL.h中定義了三個方法,之所以定義三個方法是根據我的業務需求決定的,業務需求可以參考的使用案例圖。下面代碼是NoteBL.m代碼:

@implementation NoteBL //插入Note方法-(NSMutableArray*) createNote:(Note*)model{NoteDAO *dao = [NoteDAO sharedManager];[dao create:model];return [dao findAll];} //刪除Note方法-(NSMutableArray*) remove:(Note*)model{NoteDAO *dao = [NoteDAO sharedManager];[dao remove:model];return [dao findAll];} //查詢所有資料方法-(NSMutableArray*) findAll{NoteDAO *dao = [NoteDAO sharedManager];return [dao findAll];} @end

 

 

內容來源於《iOS6開發指南》一書,作者:關東升

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.