`

iOS开发那些事-移动平台架构设计

阅读更多

低耦合企业级系统架构设计

我们往往称JavaEE或.Net 开发的产品为“系统”,而移动平台(主要是:Android、iOS和Window Phone)开发的产品为“应用”。“系统”比较复杂,需要架构设计,而“应用”相对比较简单,这是不是意味着我们不需要考虑架构问题呢?

 

我 们首先了解一下企业级系统架构设计。软件设计的原则是提高软件系统的“可复用性”和“可扩展性”,系统架构设计采用层次划分方式,这些层次之间是 松耦合的,层次的内部是高内聚的。降低耦合是软件设计的目标,能够设计出低耦合的系统,就意味着我们的系统具有“可复用性”和“可扩展性”。通用低耦合 JavaEE和.Net企业级系统架构图。

6

表示层是用户与系统交互的组件集合,用户通过这一层向系统提交请求或发出指令,系统通过这一层接收用户请求或指令,然后,将指令消化吸收后调用下一层,再将调用的结果展现到这一层。表示层应该是轻薄的不应该具有业务逻辑。

业务层是系统的核心业务处理层,负责接收表示层的指令和数据,消化吸收后,进行组织业务逻辑的处理,并将结果返回给表示层。

数据持久层是服务层用于访问数据库层,从设计规范上讲为了降低耦合度,服务层不应该具有访问数据库的代码,访问数据库的代码应该放到数据持久层中。

信息系统层,是系统的数据来源,可以是数据库、文件、遗留系统和网络数据。

移动平台的分层架构设计

移动平台的应用是缩小版本的系统,它也需要架构设计,但并非所有的应用都一定基于通用低耦合企业级系统架构,一般而言主要是涉及信息处理的应用才使用这种架构设计模式,例如:一些游戏有自己的游戏引擎,引擎也属于架构设计。iOS平台一般信息处理应用分层架构设计图。

7

表示层,iOS中的表示层是由UIKit Framework构成的,它包括我们前面学习的视图、控制器、控件和事件处理等内容;

业务逻辑层,采用什么框架要据具体的业务而定,但一般是具有一定业务处理功能的Objective-C和C++封装的类,或者是C封装的函数。

数据持久层,提供本地或网络数据访问,它可能是访问SQLite数据API函数,也可能是CoreData技术,或是访问文件的NSFileManager,或是网络通信等技术,采用什么方式要看信息系统层是什么。

信息系统层,就iOS而言它的信息来源分为:本地和网络。本地数据可以放入文件中也可以放在数据库中,目前iOS本地数据库采用SQLite3。网络可以是某个云服务,也可以是一般的Web服务。

基于同一工程的分层

架 构对于我们iPhone和iPad开发有着很现实的意义。如果我们要编写一个基于iOS(iPhone和iPad两个平台)“My备忘录”应用, 它具有:增加、删除和查询备忘录的基本功能, “备忘录”应用用例图,分层设计之后,表示层可以有不同iPhone版和iPad版本,而且业务逻辑层、数 据持久层和信息系统层都可以公用。这样可以大大减少我们的工作量,这就是分层设计的好处。

8

iOS考虑iPhone和iPad两个平台,我们绘制了设计原型草图, iPhone版本的“My备忘录”应用设计原型草图。iPad版本的“My备忘录”横屏设计原型草图, iPad版本的“My备忘录”竖屏设计原型草图。

9 10 11

 

 

在iOS平台分层的具体做法有多种模式:基于同一工程的分层、基于一个工作空间不同工程的分层和静态链接库分层。本小节介绍基于同一工程的分层。

我 们在前文中已经介绍了构建自适应iPhone和iPad工程,就是我们现在要讲的基于同一工程的分层模式。请读“备忘录”应用的代码,实现过程这 里不做介绍,打开“MyNotes”工程,在Xcode工程导航面板有3个组:PresentationLayer、 BusinessLogicLayer和PersistenceLayer。创建这3个组的目的是把不同层中类放到对应的组中便于管 理, PresentationLayer是放置的表示层相关类,BusinessLogicLayer是放置的业务逻辑层的相关 类,PersistenceLayer是放置持久层相关类。

12

各 个层的下面再如何划分呢?我们可以按照业务模块划分,也可以按照组件功能划分。本应用中PersistenceLayer层就还要分成dao和 domain两个组,dao是放置数据访问对象的,该对象中有对数据访问的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 NoteDAO

static 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开发指南》一书,作者:关东升

分享到:
评论

相关推荐

    iOS移动平台架构设计说明.doc

    iOS移动平台架构设计的核心在于构建高效、可复用和可扩展的应用程序。在iOS系统中,应用程序通常采用分层架构来实现低耦合和高内聚的设计原则,从而提高软件的稳定性和可维护性。以下是iOS移动平台架构设计的关键点...

    IOS应用源码Demo-仿合金弹头ios游戏源码-毕设学习.zip

    【标题解析】 "IOS应用源码Demo-仿合金...对于iOS开发初学者来说,这是一个很好的起点,能够将理论知识转化为实际操作经验。同时,对于有经验的开发者,这也能提供一个参考,看看他人是如何解决特定游戏开发问题的。

    IOS应用源码Demo-横向滚动的label-毕设学习.zip

    7. iOS开发工具使用:可能涉及Xcode的使用,如界面设计、代码编写、调试、构建与部署等。 8. 代码组织与管理:了解良好的代码结构和命名规范,以及如何组织项目文件。 对于学习者来说,这份源码不仅可以帮助理解iOS...

    IOS课程设计---学生信息管理系统,附带文档

    总的来说,这个项目涵盖了iOS开发中的关键技术和实践,是学习iOS开发和了解学生信息管理系统设计的一个理想案例。通过这个项目,开发者不仅可以深入理解Swift编程和iOS应用架构,还能掌握数据存储和网络通信的基本...

    iOS开发入门(iPhone和iPad开发必看)

    iOS开发入门是初学者了解和踏入移动应用开发领域的第一步,特别是针对iPhone和iPad平台。本文主要涵盖了一些基础知识和前期准备工作,旨在帮助用户无基础地开始iOS开发之旅。 1. iOS开发基本情况介绍 - iOS是苹果...

    IOS应用源码Demo-iOS开发者指南(集成常用开发代码库)-毕设学习.zip

    对于初学者来说,通过这些源码可以了解到过去几年iOS开发的一些主流实践,这有助于他们理解移动应用开发的基本流程,同时也能学习到如何将第三方库整合到项目中的技巧。 【标签】中的"IOS 源码 毕业设计 论文 App...

    EleTeam开源项目-电商全套解决方案之iOS版-Shop-iOS-Shop-iOS.zip

    1. **用户界面设计**:项目遵循iOS平台的设计规范,提供了与京东、天猫等主流电商平台相似的用户体验。它包括商品浏览、搜索、购物车、订单管理、个人中心等功能模块,确保用户能够轻松上手。 2. **服务端支持**:...

    yolov5-ios-tensorflow-lite-main.zip

    总之,将YOLOv5模型移植到iOS并使用TensorFlow Lite运行,是一项技术性较强的工作,需要对深度学习模型、TensorFlow Lite API以及iOS开发有深入理解。通过上述步骤和策略,开发者可以在移动设备上实现高效的对象检测...

    ios开发详解markdown格式

    iOS开发是指为苹果公司的移动操作系统iOS创建应用程序的过程。iOS操作系统主要用于iPhone、iPad以及iPod Touch等设备。为了开发iOS应用,开发者通常会使用两种主流的编程语言:Swift和Objective-C。此外,苹果还提供...

    【计算机软件毕业设计】基于iOS平台开发的移动应用-辣妈帮(完整版).doc

    【基于iOS平台开发移动应用-辣妈帮】的毕业设计主要涵盖了iOS开发技术、移动应用设计原则以及数据库管理等多个方面。iOS系统是苹果公司推出的移动操作系统,占据了全球超过30%的市场份额,因此,开发针对iOS的应用...

    ios架构与设计

    社交型App作为一种常见的移动应用类型,在iOS平台上的设计和开发具有一定的共性。对于这类应用而言,它们往往需要满足以下几种基本需求: 1. **用户认证与授权**:用户需要能够注册、登录并管理个人账户,这是使用...

    IOS应用源码Demo-哈哈镜-毕设学习.zip

    6. **模型-视图-控制器(MVC)**:理解并应用iOS开发中的主要设计模式,如何分离业务逻辑和用户界面。 7. **数据存储**:如果应用有数据保存需求,可能会涉及到UserDefaults、Core Data或SQLite数据库。 8. **网络...

    IOS应用源码Demo-简单的滤镜demo-毕设学习.zip

    【标题】"IOS应用源码Demo-简单的滤镜demo-毕设学习.zip" 提供了一个适用于iOS开发的学习资源,特别适合那些正在进行毕业设计或者想要深入理解iOS应用开发的学生。这个压缩包包含了一个基本的滤镜应用程序的源代码,...

    IOS应用源码Demo-宫格视图(支持横屏)LOGO-毕设学习.zip

    ”这段描述告诉我们这个代码库是大约两年前的,可能包含了当时流行的iOS开发技术和实践。它主要用于毕业设计项目,这意味着它可能包含了从零开始构建一个完整应用所需的基本结构和功能,适合初学者或正在做毕业设计...

    2010架构师大会-移动互联网产品架构设计

    1. **移动平台特性**:移动互联网产品必须考虑不同移动平台(如iOS、Android)的特性,包括硬件限制、操作系统差异、用户交互模式以及电池寿命管理等。这需要架构师对各个平台有深入理解,并设计出能够适应这些特性...

    IOS应用源码Demo-贝塞尔曲线demo:一个运动的物体:PathMove for iOS-毕设学习.zip

    这表明源码可能包含详细注释和解释,便于初学者理解代码逻辑和iOS开发的基本概念。 【标签解析】 标签“IOS 源码 毕业设计 论文 App”进一步强调了这个压缩包的主要内容和用途。"IOS"表示这是与iOS操作系统相关的...

    Developing-iOS-9-Apps-with-Swift, Stanford 公开课,Developing iOS 9 Apps with Swift 字幕翻译.zip

    除此之外,课程还会涉及Model-View-Controller(MVC)设计模式,这是iOS开发中的常见架构。MVC将应用分为三个部分:模型(Model)负责数据的存储和管理;视图(View)显示用户界面;控制器(Controller)协调模型和...

    iOS实例开发源码——iOS-Gamer-Cocos2D-86714e3.zip

    通过对“iOS-Gamer-Cocos2D-86714e3.zip”源码的深入学习,开发者可以掌握Cocos2D在iOS游戏开发中的实际应用,理解游戏架构设计,以及如何利用Cocos2D提供的工具和方法,高效地创建自己的游戏。同时,这个项目也是一...

Global site tag (gtag.js) - Google Analytics