MVI架构

一、背景

  • MVI在架构分层上和MVP没有本质区别,但区别主要体现在架构风格和编程思想上
  • MVI风格
    • 面向意图,响应式编程
    • 状态模式 + 流处理思想 = 单向不可变数据流
    • 统一状态源
    • 恢复现场:进程重生后,堆栈中返回,屏幕旋转等
    • 可调试、可重现。日志中记录输入、状态、输出就可以据此复现问题
    • 可测试。
    • 缺点:对于初状态需要关注
  • MVP、MVVM有什么问题?
    • M、V、P可能各有各的状态

二、MVI - Model-View-Intent

  • MVI是一种响应式和流式的处理思想,将意图事件(用户操作),通过函数转换为特定Model(状态),将其结果反馈给用户(渲染界面)。
  • 抽象下来得到intent(),model(),view() 三个方法
    • intent() 即意图,接收用户的输入(即UI事件,如点击事件)把意图和相关参数封装为数据结构,传递给model()方法。传递意图的接口是统一的,而不像MVP持有Presenter,并调用Presenter的多个接口。
    • model() 不同于一般的model,这里说的model相当于状态模型里的一种状态,model内部的逻辑是不可变的,这能保证状态逻辑的一致性,同时降低系统的复杂性。
    • view() 接收model传来的state渲染UI
view.(model(intent))

MVI跟MVP的区别是,前者是面向意图编程,后者是面向接口编程

三、MVI的演进版

mvi演进版

基本类

  • Intent
    • Data class
    • V层的意图
    • 强调的是交互意图
  • IntentFilter
    • ObservableTransformer
    • 对UI意图进行过滤和转化为业务逻辑Action
  • Action
    • Data class
    • 包含了该业务逻辑需要处理的信息的类
    • 类似EventBus的Event
    • 强调的是业务意图
  • Processor
    • ObservableTransformer
    • 执行实际业务
  • Result
    • Data class
    • 包含UI通知状态 UiNotificationStatus:成功、失败、正在等待结果
    • 成功时按需携带结果数据
    • 失败时携带异常
  • Reducer
    • 我们把他翻译成 状态缩减:多个状态(Model)缩减成一个。类似于scan方法
    • 更新状态,输出State给View渲染UI
  • State
    • Data class
    • 包含渲染View所需要的所有信息

你可能感兴趣的:(MVI架构)