加入收藏 | 设为首页 | 会员中心 | 我要投稿 52刷机网 (https://www.52shuaji.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 苹果频道 > 苹果资讯 > 正文

深入理解iOS设计模式

发布时间:2017-05-29 23:41:08 所属栏目:苹果资讯 来源:www.jianshu.com
导读:做iOS开发也好几年了,记得自己刚入行时,对iOS开发模式也是一知半解,后面项目做多了,以及看一些优秀书籍之后对他有了进一步的理解;发现自己写的代码中无形之中就用了很多的设计模式,只不过是不知道相应的设计模式...
副标题[/!--empirenews.page--]

做iOS开发也好几年了,记得自己刚入行时,对iOS开发模式也是一知半解,后面项目做多了,以及看一些优秀书籍之后对他有了进一步的理解;发现自己写的代码中无形之中就用了很多的设计模式,只不过是不知道相应的设计模式...

做 iOS开发也好几年了,记得自己刚入行时,对iOS 开发模式也是一知半解,后面项目做多了,以及看一些优秀书籍之后对他有了进一步的理解;发现自己写的代码中无形之中就用了很多的设计模式,只不过是不知道相应的设计模式术语而已,所以决定把自己做的项目中的一个小模块来写一篇iOS设计模式的文章,一是记录自己的学习;二是让入门者可以作为参考,来理解iOS设计模式。设计模式是软件设计中常见问题的可重复使用的解决方案。 它们是旨在帮助您编写易于理解和重用的代码的模板。 它们还可以帮助您创建松散耦合的代码,以便您可以在代码中更改或替换组件,而不必太麻烦。本文将通过一个小项目的形式来讲解iOS的设计模式。通过跟着我一步一步操作你将学到:什么是设计模式;为什么要使用设计模式;以及怎样在自己的项目中使用合适的设计模式。设计模式分为三大类:

  1. 构造模式:单例模式(Singleton),抽象工厂模式(Abstract Factory)等等;
  2. 结构模式:MVC,适配器模式(Adapter),外观模式(Facade),装饰模式(Decorator)等等;
  3. 行为模式:观察者(Observer),备忘录(Memento),命令模式(Command)。整个项目完成将会是如下效果图:
    深入理解iOS设计模式
    image.png

开始鲁代码

github上下载starter project,使用Xcode打开项目,这是一个新建的空项目,我将Main.storyboard给删除了,在appdelegate中使用代码设置window的rootViewController为ViewController;以及将books.json放入到了本地,模拟网络请求来的书籍数据(这部分涉及到公司的机密资源,所以只能这样模拟)。

1、使用快捷键Command+N,选择iOS->Swift File,并且命名为Book,新建一个Book结构体作为模型,并且编写如下代码。(在Objective-C我们一般是新建一个Book类作为模型,但是swift中官方推荐使用结构体,更加轻量级),此处我使用了JSONExport开源工具生成Book结构体,这是一个很强大的将json转化模型的Mac桌面应用。

struct Book {    var bid: Int!   var bookName: String!   var isRead: Bool!   var orientation: Int!   var pic: String!     /**    * Instantiate the instance using the passed dictionary values to set the properties values    */   init(fromDictionary dictionary: [String: Any]){     bid = dictionary["bid"] as? Int     bookName = dictionary["book_name"] as? String     isRead = dictionary["is_read"] as? Bool     orientation = dictionary["orientation"] as? Int     pic = dictionary["pic"] as? String   }    /**    * Returns all the available property values in the form of [String:Any] object where the key is the approperiate json key and the value is the value of the corresponding property    */   func toDictionary() -> [String:Any]   {     var dictionary = [String: Any]()     if bid != nil{       dictionary["bid"] = bid     }     if bookName != nil{       dictionary["book_name"] = bookName     }     if isRead != nil{       dictionary["is_read"] = isRead     }     if orientation != nil{       dictionary["orientation"] = orientation     }     if pic != nil{       dictionary["pic"] = pic     }     return dictionary   }  }

当然在实际项目中swift的json解析我们还可以使用GitHub开源的SwiftyJSON,这个也很好用,使用这个就能够减少model类的创建,这个两种使用方式各有各的好吧。

2、Command + N,选择Cocoa Touch Class,命名为BookView作为UICollectionView的子类,language选择Swift;同样操作新建一个BookCell作为UICollectionViewCell的子类,在选择language上面勾选Also create XIB file。新建完毕之后记得在这两个类前面添加final修饰符(这里涉及到代码规范的内容,我后续将会写一篇这样的文章,苹果官方推荐那些些不会继承的类可以添加final修饰,这么做的好处是提高编译速度,当项目庞大的时候优势就明显了,我也深有体会)

MVC设计模式

Model View Controller(模型视图控制器)是我们所有设计模式中最常用的,他根据程序中的角色对对象进行分类,使代码干净分离,低耦合;Model:保存程序的数据并且定义如何操作它的对象。本例子的Model是结构体Book;View:负责程序UI视觉元素的表示以及与用户的交互响应,基本上所有的UIView及其子类都属于这一类;本例中的View是BookView;Controller:控制器是View和Model之间的协调者,它访问模型中的数据,并且显示于视图,并且监听用户事件并根据需要操作数据;本例中的Controller是ViewController下图很好的显示了这三者之间的关系:

深入理解iOS设计模式
MVC
  1. 模型数据的变化会通知通知控制器,同时控制器就会更新视图上的数据;
  2. 当用户有操作交互时,视图也能通知控制器,于是控制器更新模型中的数据信息。有些人就会有疑问了,为什么不把所有的都写在一个类里面,直接在将视图和模型都写在控制器里面,这样操作起来很容易。我们都知道软件设计有个很重要的原则就是:高内聚,低耦合,所以我们得考虑把代码分离和重用。理想情况下,视图应与模型完全分开。 如果View不依赖于Model的具体实现,则可以使用不同的模型重用其他数据。例如本例中的模型Book,因为不依赖任何视图类,所以可以很简单的重复使用。以及视图类BookView和BookCell,在将来要添加某个功能时完全可以复用,例如我做的真实项目中有个功能模块是书籍的本地下载页面,此时就完全可以复用整个视图类。

(编辑:52刷机网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读