文章目录

  • 何为架构?
    • MVC - Apple版
    • MVC – 变种
    • MVP
    • MVVM
  • 设计模式
  • 面试题

何为架构?

  • 架构(Architecture):软件开发中的设计方案,类与类之间的关系、模块与模块之间的关系、客户端与服务端的关系。
  • 经常听到的架构名词:MVC、MVP、MVVM、VIPER、CDD、三层架构、四层架构等。

MVC - Apple版

Model-View-Controller

是iOS开发中常用的模式 ,Model和View之间没有任何直接到关系,通过Controller作为桥梁将二者联系起来。(Controller可初始化数据并将数据传递给Model;Model可以将数据传递给Controller,Controller将这些数据赋给View展示;View可以传递事件给Controller,Controller通过事件判断区出来数据Model)。
优点:View、Model可以重复利用,可以独立使用
缺点:Controller的代码过于臃肿。
Model-View-Controller 苹果官方文档

MVC – 变种

Model-View-Controller

变种的MVC,每一个view对应一个Model,只要Controller设置View的Model,就可直接展示对应的示图(常见的cell添加一个model属性就是这种模式)。
优点:对Controller进行瘦身,将View内部的细节封装起来了,外界不知道View内部的具体实现;
缺点:View依赖于Model。

MVP

  • Model-View-Presenter
  • MVP中的V在iOS中指的是ViewController和View。MVP将MVC的ViewController进行拆分:视图数据逻辑处理部分为P,ViewController剩余部分与View合并成V,V和P之间通过Protocol进行通信。
  • MVP实现了各模块的解藕,具有更好的可测试性。但是总体代码量比MVC大。
    另外,iOS MVC更适用于快速开发,即代码规模较小的项目。因此将简单的MVC的Demo改成MVP,反而会显得笨拙。
#import "MJAppPresenter.h"
#import "MJApp.h"//Model
#import "MJAppView.h"//View
@interface MJAppPresenter() <MJAppViewDelegate>
@property (weak, nonatomic) UIViewController *controller;
@end
@implementation MJAppPresenter
- (instancetype)initWithController:(UIViewController *)controller
{if (self = [super init]) {self.controller = controller;// 创建ViewMJAppView *appView = [[MJAppView alloc] init];appView.frame = CGRectMake(100, 100, 100, 150);appView.delegate = self;[controller.view addSubview:appView];// 加载模型数据MJApp *app = [[MJApp alloc] init];app.name = @"QQ";app.image = @"QQ";// 赋值数据[appView setName:app.name andImage:app.image];}return self;
}
#pragma mark - MJAppViewDelegate
- (void)appViewDidClick:(MJAppView *)appView
{NSLog(@"presenter 监听了 appView 的点击");
}
@end#import "ViewController.h"
#import "MJAppPresenter.h"
@interface ViewController ()
@property (strong, nonatomic) MJAppPresenter *presenter;
//@property (strong, nonatomic) MJOtherPresenter *presenter1;
//@property (strong, nonatomic) MJNewsPresenter *presenter2;
@end
@implementation ViewController
- (void)viewDidLoad {[super viewDidLoad];self.presenter = [[MJAppPresenter alloc] initWithController:self];
}

可以看出View和Model的都是直接和Presenter传递值和交互的,时间处理也在Presenter中,不同的View和Model可以给Controller添加不同的Presenter属性即可,Controller不再直接是View和Model的桥梁。

MVVM

  • Model-View-ViewModel
  • Model-View-ViewModel for iOS
  • MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。 唯一的区别是,它采用双向绑定(data-binding);当被绑定对象某个值的变化时,绑定对象会自动感知,无需被绑定对象主动通知绑定对象。可以使用KVO和RAC实现。例如在Label中显示倒计时,是V绑定了包含定时器的VM。
  • 双向绑定在MVVM中指的是V和VM之间相互绑定。例如TextField的text长度达到阈值,另一个Button改变背景颜色。这个过程中首先VM感知V中TextField的text属性长度变化,V感知VM中对应的状态属性。一旦V中TextField的text属性长度超出VM中的阈值,VM中的状态属性改变,触发V中Button的背景色发生改变。
  • MVVM的优点:
  1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
  2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
  3. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计。
  4. 可测试。界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。
  • facebookKVOController九可以用来双向绑定,其github地址为:KVOController
//View
#import <UIKit/UIKit.h>
@class MJAppView, MJAppViewModel;
@protocol MJAppViewDelegate <NSObject>
@optional
- (void)appViewDidClick:(MJAppView *)appView;
@end
@interface MJAppView : UIView
@property (weak, nonatomic) MJAppViewModel *viewModel;
@property (weak, nonatomic) id<MJAppViewDelegate> delegate;
@end#import "MJAppView.h"
#import "NSObject+FBKVOController.h"
@interface MJAppView()
@property (weak, nonatomic) UIImageView *iconView;
@property (weak, nonatomic) UILabel *nameLabel;
@end
@implementation MJAppView
- (instancetype)initWithFrame:(CGRect)frame
{if (self = [super initWithFrame:frame]) {UIImageView *iconView = [[UIImageView alloc] init];iconView.frame = CGRectMake(0, 0, 100, 100);[self addSubview:iconView];_iconView = iconView;UILabel *nameLabel = [[UILabel alloc] init];nameLabel.frame = CGRectMake(0, 100, 100, 30);nameLabel.textAlignment = NSTextAlignmentCenter;[self addSubview:nameLabel];_nameLabel = nameLabel;}return self;
}
- (void)setViewModel:(MJAppViewModel *)viewModel
{_viewModel = viewModel;__weak typeof(self) waekSelf = self;//监听viewModel的name和image属性变化,一旦变化就给view赋值[self.KVOController observe:viewModel keyPath:@"name" options:NSKeyValueObservingOptionNew block:^(id  _Nullable observer, id  _Nonnull object, NSDictionary<NSKeyValueChangeKey,id> * _Nonnull change) {waekSelf.nameLabel.text = change[NSKeyValueChangeNewKey];}];[self.KVOController observe:viewModel keyPath:@"image" options:NSKeyValueObservingOptionNew block:^(id  _Nullable observer, id  _Nonnull object, NSDictionary<NSKeyValueChangeKey,id> * _Nonnull change) {waekSelf.iconView.image = [UIImage imageNamed:change[NSKeyValueChangeNewKey]];}];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{if ([self.delegate respondsToSelector:@selector(appViewDidClick:)]) {[self.delegate appViewDidClick:self];}
}
@end//ViewModel
#import <UIKit/UIKit.h>
@interface MJAppViewModel : NSObject
- (instancetype)initWithController:(UIViewController *)controller;
@end
#import "MJAppViewModel.h"
#import "MJApp.h"
#import "MJAppView.h"
@interface MJAppViewModel() <MJAppViewDelegate>
@property (weak, nonatomic) UIViewController *controller;
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *image;
@end
@implementation MJAppViewModel
- (instancetype)initWithController:(UIViewController *)controller
{if (self = [super init]) {self.controller = controller;// 创建ViewMJAppView *appView = [[MJAppView alloc] init];appView.frame = CGRectMake(100, 100, 100, 150);appView.delegate = self;appView.viewModel = self;//双向绑定[controller.view addSubview:appView];// 加载模型数据MJApp *app = [[MJApp alloc] init];app.name = @"QQ";app.image = @"QQ";// 设置数据self.name = app.name;self.image = app.image;}return self;
}
#pragma mark - MJAppViewDelegate
- (void)appViewDidClick:(MJAppView *)appView
{NSLog(@"viewModel 监听了 appView 的点击");
}
@end//Controller
#import "ViewController.h"
#import "MJAppViewModel.h"
@interface ViewController ()
@property (strong, nonatomic) MJAppViewModel *viewModel;
@end
@implementation ViewController
- (void)viewDidLoad {[super viewDidLoad];self.viewModel = [[MJAppViewModel alloc] initWithController:self];
}
@end

可以看出Controller 中只添加了ViewModel,不再与View和Model有任何关系,ViewModel初始化了View和Model,并将Model数据绑定给自己;而View绑定了ViewModel属性,并监听器值得变化,一旦有变化设置相应的控件;ViewModel为View代理,响应view的一些事件。

设计模式

  • 设计模式(Design Pattern)
    是一套被反复使用、代码设计经验的总结
    使用设计模式的好处是:可重用代码、让代码更容易被他人理解、保证代码可靠性
    一般与编程语言无关,是一套比较成熟的编程思想
  • 设计模式可以分为三大类
  1. 创建型模式:对象实例化的模式,用于解耦对象的实例化过程
    单例模式、工厂方法模式,等等
  2. 结构型模式:把类或对象结合在一起形成一个更大的结构
    代理模式、适配器模式、组合模式、装饰模式,等等
  3. 行为型模式:类或对象之间如何交互,及划分责任和算法
    观察者模式、命令模式、责任链模式,等等

面试题

  • 讲讲 MVC、MVVM、MVP,以及你在项目里具体是怎么写的?
    把上面的讲一下就好了。

  • 你自己用过哪些设计模式?
    单例、代理、观察者模等等。

  • 一般开始做一个项目,你的架构是如何思考的?
    从实现方式思考,从结构模块思考,自己发挥。



  • 以上详细demo下载地址:iOS底层原理之架构设计demo
  • 参考
    浅谈开发中的MVVM模式及与MVP和MVC的区别
    iOS开发中的MVC,MVP和MVVM
    FBKVOController详解
    iOS开发工具,ios开发类库

iOS底层原理之架构设计相关推荐

  1. 视频教程-iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-iOS

    iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化 小码哥教育CEO,曾开发了2个iOS的流行开源框架(MJRefresh.MJExtension),目前在国内的使用率非常高. 李 ...

  2. iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-李明杰-专题视频课程...

    iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-236人已学习 课程介绍         得遇名师,突飞猛进!iOS培训王者MJ(李明杰)老师精心研发,iOS进阶课程,实用技术 ...

  3. iOS底层原理探究 第一探. 事件传递和响应者链

    一. 声明:  本文意在探讨, 也参考了几位大神的文章, 在最后我会把链接发出来, 如果有理解错误的地方, 请大神们指正哈! 二. 前言:  最近自己做项目的时候, 用到了UITabbarContro ...

  4. iOS底层原理之内存管理

    文章目录 定时器 CADisplayLink.NSTimer GCD定时器 内存管理 iOS程序的内存布局 Tagged Pointer OC对象的内存管理 拷贝 引用计数的存储 dealloc 自动 ...

  5. iOS底层原理 - 常驻线程

    iOS底层原理 - 常驻线程 在 AFN 2.0 时代,会经常看到 AFN 创建一个常驻线程的方式: 0️⃣ AFN 2.0 时代的常驻线程 + (NSThread *)networkRequestT ...

  6. iOS组件化及架构设计

    关于组件化 网上组件化的文章很多.很多文章一提到组件化,就会说解耦,一说到解耦就会说路由或者runtime.好像组件化 == 解耦 == 路由/Runtime,然而这是一个非常错误的观念.持有这一观点 ...

  7. Tomcat 架构原理到架构设计,写得非常好!

    Tomcat 架构原理解析到架构设计借鉴 Tomcat 发展这么多年,已经比较成熟稳定.在如今『追新求快』的时代,Tomcat 作为 Java Web 开发必备的工具似乎变成了『熟悉的陌生人』,难道说 ...

  8. Linux图片的灰度化,iOS图像灰度解决方案--架构设计

    ZUNL7OS33q.gif 这是一个类似于QQ头像的处理方法,据我所知QQ也是用这种方式处理的,当然我们有两种方案可以选择 第一种方案 使用第三方工具 ---OpenCV(官网内可下载包文件) Op ...

  9. 阿里P8架构师谈:Zookeeper的原理和架构设计,以及应用场景

    什么是 Zookeeper Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如: 统一命名服务 状态同步服务 集群 ...

最新文章

  1. iOS enum 定义与使用
  2. Java Review - 并发编程_Unsafe
  3. down 网卡端口周期性的up_down 网卡端口周期性的up_思科交换机端口down或up故障原因...
  4. MySQL笔记创建表结构_mysql笔记
  5. 关于WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解
  6. 计算机组装没步的组件,计算机组装教案.doc
  7. 漫步凸分析五——函数运算
  8. C/C++ stack栈的理解以及使用
  9. TCP的带宽估计和丢包恢复
  10. Eclipse:构造函数不提示才发现
  11. java 日期计算类_日期类的加减及java中所以日期类的操作算法大全
  12. AD09 PCB制作开异性窗口
  13. 交换机Vlan中tagged和untagged的区别
  14. java生成png热力图_热力图与原始图像融合
  15. R-CNN文章详细解读
  16. 区块链MMO游戏该如何设计Token经济?
  17. 一步一步教你开发微信扫码联合登录
  18. 儿子跟妈妈关系不好怎么办?这里有解决办法!
  19. fastjson的漏洞解决—2020年5月28日
  20. 《算法图解》学习笔记(十一):十种经典的算法与数据结构

热门文章

  1. python对财务的作用_学习Python对财务工作者有哪些用途?
  2. 超级码力在线编程大赛初赛 第3场 1.最大公倍数
  3. Ubuntu 14.04.2安装内核源码树以及编译
  4. 给图像添加相框、圆形圆角显示图片、图像合成知识
  5. 【阿里云ECS使用FTP】使用FileZilla连接阿里云Windows服务器
  6. 后台系统的权限控制与管理
  7. Spring Boot多模块项目打包
  8. C语言及程序设计 实践参考——个人所得税计算器switch语句版
  9. 职场情商比职场生存法则更重要!!!
  10. ue4导入倾斜摄影_一种基于Smart3D倾斜摄影技术输出实际地形等高线的方法与流程...