iOS--明白MVC与MVVM

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

MVC

MVC 是一种将应用步伐分为三部分的架构模式:Model(模型)、View(视图)、Controller(控制器)。每部分负责差异的职责,使代码更加模块化、易于维护。
Model:负责业务数据的管理,包罗业务数据的结构和逻辑。以及数据存储。
View:负责界面的展示和用户交互。
Controller:负责毗连 Model 和 View,处理用户输入并更新 Model 和 View。

其中ControllerModel和View的桥梁,见下图:


   整个框架的设计最优结构是View层不依靠Controller层而独立存在,Model层不依靠Controller层和View层独立存在,Controller层负责关联二者,View层只负责展示,Model层持有数据和业务的具体实现,而Controller层则处理事故相应以及业务的调用以及通知界面更新。三者之间一定要明确的定义为单向依靠,而不应该出现双向依靠
  
Swift demo
  1. import UIKit
  2. // Model: 数据结构
  3. struct User {
  4.     let name: String
  5.     let age: Int
  6.     func isAdult() -> Bool {
  7.         return age >= 18
  8.     }
  9. }
  10. // View: 展示用户信息
  11. class UserView: UIView {
  12.     private let nameLabel = UILabel()
  13.     private let ageLabel = UILabel()
  14.    
  15.     override init(frame: CGRect) {
  16.         super.init(frame: frame)
  17.         setupView()
  18.     }
  19.    
  20.     required init?(coder: NSCoder) {
  21.         super.init(coder: coder)
  22.         setupView()
  23.     }
  24.    
  25.     private func setupView() {
  26.         addSubview(nameLabel)
  27.         addSubview(ageLabel)
  28.         // ...布局代码省略
  29.     }
  30.    
  31.     func updateView(name: String, age: Int) {
  32.         nameLabel.text = "Name: \(name)"
  33.         ageLabel.text = "Age: \(age)"
  34.     }
  35. }
  36. // Controller: 连接 Model 和 View
  37. class UserController: UIViewController {
  38.     private let userView = UserView()
  39.     private var user: User?
  40.     override func viewDidLoad() {
  41.         super.viewDidLoad()
  42.         view.addSubview(userView)
  43.         // ...布局代码省略
  44.         
  45.         // 设置 Model 并更新 View
  46.         userView.updateView(name: "Alice", age: 25)
  47.         
  48.     }
  49. }
复制代码
好处:进步开辟效率,简化操纵

坏处:
• UIViewController 变得过于臃肿,因为它负担了太多职责。
• View 和 Controller 间的耦合度较高,难以测试。




MVP

MVP 是一种改进的 MVC 设计模式,它通过 Presenter 更清晰地管理 View 和 Model 之间的交互。MVP 中 View 和 Model 的依靠关系较少,逻辑处理更加集中在 Presenter 中。MVP 模式通过引入 Presenter 进一步解耦,将业务逻辑与视图更新独立出来。具体来说:

Model:负责数据处理和业务逻辑,与 MVC 中的 Model 雷同。它处理全部与数据相干的操纵,好比获取、保存和更新数据。
View:只负责显示 UI 和用户的输入,尽可能简单。它不直接与 Model 交互,而是通过 Presenter 进行通信。View 不包罗任何业务逻辑。
Presenter:是 View 和 Model 的中间层,负责从 Model 获取数据并转达给 View,同时处理用户输入和更新 Model。Presenter 不依靠于具体的 UI 框架,因此更易于测试。
结构如下:

在 MVP 中,View 非常轻量,几乎不包罗任何业务逻辑。全部与 View 相干的业务逻辑都交给 Presenter 来处理。View 和 Model 之间没有直接交互,全部交互都通过 Presenter。
长处

• Presenter 不依靠具体的 View,实现了业务逻辑的分离,增强了代码的可测试性。

缺点

• 由于通过协议来定义 View,会带来额外的代码复杂度。


MVVM

MVVM 是一种更注意数据绑定息争耦的架构模式,分为三部分:Model(模型)、View(视图)、ViewModel(视图模型)。其中视图模型(ViewModel)其实就是MVP模式中的P

Model:和 MVC 中雷同,负责数据管理。
View:负责界面的展示。
ViewModel:负责处理 Model 和 View 的逻辑,通常包罗数据的转换、绑定等,使 View 更加轻量化。

swift demo
ViewModel & Model
  1. import Foundation
  2. protocol ViewModelDelegate: AnyObject {
  3.     func didUpdateData(_ viewModel: ViewModel)
  4. }
  5. class ViewModel {
  6.     weak var delegate: ViewModelDelegate?
  7.     private var model: Model
  8.     var displayText: String {
  9.         return "Hello, \(model.name)"
  10.     }
  11.     init(model: Model) {
  12.         self.model = model
  13.     }
  14.     func updateName(to newName: String) {
  15.         model.name = newName
  16.         delegate?.didUpdateData(self) // 通知 View 数据已更新
  17.     }
  18. }
  19. class Model {
  20.     var name: String
  21.     init(name: String) {
  22.         self.name = name
  23.     }
  24. }
复制代码

ViewController (View)
  1. import UIKit
  2. class ViewController: UIViewController, ViewModelDelegate {
  3.    
  4.     private var viewModel: ViewModel!
  5.     private let nameLabel = UILabel()
  6.     private let changeButton = UIButton(type: .system)
  7.     override func viewDidLoad() {
  8.         super.viewDidLoad()
  9.         // 初始化 Model 和 ViewModel
  10.         let model = Model(name: "World")
  11.         viewModel = ViewModel(model: model)
  12.         viewModel.delegate = self
  13.         
  14.         setupUI()
  15.         updateUI()
  16.     }
  17.    
  18.     private func setupUI() {
  19.         view.backgroundColor = .white
  20.         nameLabel.translatesAutoresizingMaskIntoConstraints = false
  21.         view.addSubview(nameLabel)
  22.         nameLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
  23.         nameLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
  24.         changeButton.setTitle("Change Name", for: .normal)
  25.         changeButton.translatesAutoresizingMaskIntoConstraints = false
  26.         view.addSubview(changeButton)
  27.         changeButton.topAnchor.constraint(equalTo: nameLabel.bottomAnchor, constant: 20).isActive = true
  28.         changeButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
  29.         changeButton.addTarget(self, action: #selector(changeName), for: .touchUpInside)
  30.     }
  31.     @objc private func changeName() {
  32.         viewModel.updateName(to: "MVVM")
  33.     }
  34.    
  35.     private func updateUI() {
  36.         nameLabel.text = viewModel.displayText
  37.     }
  38.     // ViewModelDelegate 方法,ViewModel 数据变化时触发
  39.     func didUpdateData(_ viewModel: ViewModel) {
  40.         updateUI()
  41.     }
  42. }
复制代码


长处
• View 和业务逻辑的完全分离,增强了代码的可测试性。
• 数据绑定使得 UI 更新非常方便。

缺点
• 初期代码复杂度较高,尤其是在没有使用相应式编程的情况下。



mvc的Controller和mvp的Presenter和mvvm的viewmodel的重要区别:

重要是view的交互、与model的交互区别。

总结:


参考:
https://medium.com/@wanghaonanlpc/mvc-vs-mvp-vs-mvvm-bfcf7568aac0
iOS简单明白区分MVC、MVP、MVVM_ios mvvm-CSDN博客


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表