13_iOS中的架构及设计模式

iOS中的三层架构、四层架构

三层架构
  • 界面层 (MVC、MVP、MVVM)
  • 业务层
  • 数据层(网络数据&本地数据)
四层架构
  • 界面层 (MVC、MVP、MVVM)
  • 业务层
  • 网络层
  • 本地数据层

其中,界面层的架构模式又分为好多种,从最开始的MVC模式,演化到MVP,然后到现在的MVVM模式,在不断的演化过程中核心思想归根结底还是:降低各组件之间的耦合度,使得数据的流向更加清晰明了。

一、MVC(Model、View、Controller

MVC是比较直观的架构模式,最核心的就是通过Controller层来进行调控。

  • Model和View永远不能相互通信,只能通过Controller传递。
  • Controller可以直接与Model对话(读写调用Model),Model通过NOtification和KVO机制与Controller间接通信。
  • Controller可以直接与View对话,View通过action向Controller报告事件的发生(用户点击了按钮)。Controller是View的直接数据源
优缺点
  • 优点:对于混乱的项目组织方式,有了一个明确的组织方式。通过Controller来掌控全局,同时将View展示和Model的变化分开
  • 缺点:愈发笨重的Controller,随着业务逻辑的增加,大量的代码放进Controller,导致Controller越来越臃肿,堆积成千上万行代码,后期维护起来费时费力。

MVC变种

优缺点:
  • 优点:对Controller进行瘦身,将View内部的细节封装起来了,外界不知道View内部的具体实现
  • 缺点:View依赖于Model

二、MVP(Model、View、Presenter)

我理解的MVP设计模式,是在MVC的基础上对Controller进行瘦身。Controller只是用来管理Presenter,然后由Presenter来负责Model和View之间的通信,以及View向Controller报告事件。

简单的示例代码如下

  • Presenter类
    //Presenter.h
    #import 
    
    @interface Presenter : NSObject
    - (instancetype)initWithController:(UIViewController *)controller;
    @end
    
    //Presenter.m
    #import "Presenter.h"
    #import "App.h"
    #import "AppView.h"
    
    @interface Presenter() 
    @property (weak, nonatomic) UIViewController   *controller;
    @end
    
    @implementation Presenter
    
    - (instancetype)initWithController:(UIViewController *)controller
    {
        if (self = [super init]) {
            self.controller = controller;
          
            // 创建View
            AppView *appView = [[AppView alloc] init];
            appView.frame = CGRectMake(100, 100, 100, 150);
            appView.delegate = self;
            [controller.view addSubview:appView];
          
            // 加载模型数据
            App *app = [[App alloc] init];
            app.name = @"QQ";
            app.image = @"QQ";
          
            // 赋值数据
            appView.iconView.image = [UIImage imageNamed:app.image];
            appView.nameLabel.text = app.name;
        }
        return self;
    }
    
    #pragma mark - AppViewDelegate
    - (void)appViewDidClick:(AppView *)appView
    {
        NSLog(@"presenter 监听了 appView 的点击");
    }
    
    @end
    
  • ViewController类
     //ViewController.m
     #import "ViewController.h"
     #import "Presenter.h"
    
     @interface ViewController ()
     @property (strong, nonatomic) Presenter *presenter;
     //@property (strong, nonatomic) OtherPresenter *presenter1;
     @end
    
     @implementation ViewController
    
     - (void)viewDidLoad {
         [super viewDidLoad];
      
         self.presenter = [[Presenter alloc] initWithController:self];
     }
    
     @end
    

三、MVVM(Model、View、ViewModel)

MVVM也是对Controller进行瘦身的一种策略,将业务逻辑放到ViewModel中去处理,比如发送网络请求,加载网络数据进行字典转模型操作等等。

简单的示例代码如下

  • ViewModel类
//ViewModel.h
#import 

@interface ViewModel : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *image;

- (void)loadApp;

@end

//ViewModel.m
import "ViewModel.h"
#import "App.h"

@implementation ViewModel

- (void)loadApp
{
    // 加载网络数据、字典转模型
    App *app = [[App alloc] init];
    app.name = @"QQ";
    app.image = @"QQ";
    
    self.name = [NSString stringWithFormat:@"000-%@", app.name];
    self.image = app.image;
}

@end

  • ViewController类
//ViewController.m
#import "ViewController.h"
#import "AppView.h"
#import "ViewModel.h"

@interface ViewController () 
@property (nonatomic, strong) ViewModel *appVM;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 创建viewModel
    self.appVM = [[ViewModel alloc] init];
    [self.appVM loadApp];
    
    // 创建view
    AppView *appView = [[AppView alloc] init];
    appView.frame = CGRectMake(100, 100, 100, 150);
    appView.delegate = self;
    [self.view addSubview:appView];
    
    // 设置数据到view上
    appView.nameLabel.text = self.appVM.name;
    appView.iconView.image = [UIImage imageNamed:self.appVM.image];
}

#pragma mark - MJAppViewDelegate
- (void)appViewDidClick:(AppView *)appView
{
    NSLog(@"控制器监听到了appView的点击");
}

@end

你可能感兴趣的:(13_iOS中的架构及设计模式)