Swift 代码实现MVC、MVVM、MVP开发模式

MVC实现:

MVC 模式是一种将应用程序分成三个基本部分的软件设计模式:模型、视图和控制器。模型是应用程序中用于处理数据和业务逻辑的组件,视图是应用程序中负责展示数据和用户交互的组件,控制器是应用程序中用于协调模型和视图之间交互的组件。MVC 模式可以使应用程序的各个组件彼此分离,从而提高应用程序的可维护性和可扩展性。

Model:

class Model {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

View:

class View: UIView {
    var nameLabel: UILabel!
    var ageLabel: UILabel!
    
    init() {
        super.init(frame: .zero)
        setupUI()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func setupUI() {
        backgroundColor = .white
        
        nameLabel = UILabel()
        nameLabel.textAlignment = .center
        nameLabel.font = .systemFont(ofSize: 20)
        addSubview(nameLabel)
        
        ageLabel = UILabel()
        ageLabel.textAlignment = .center
        ageLabel.font = .systemFont(ofSize: 20)
        addSubview(ageLabel)
        
        nameLabel.translatesAutoresizingMaskIntoConstraints = false
        nameLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        nameLabel.centerYAnchor.constraint(equalTo: centerYAnchor, constant: -20).isActive = true
        
        ageLabel.translatesAutoresizingMaskIntoConstraints = false
        ageLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        ageLabel.centerYAnchor.constraint(equalTo: centerYAnchor, constant: 20).isActive = true
    }
    
    func updateView(name: String, age: Int) {
        nameLabel.text = name
        ageLabel.text = "\(age)"
    }
}

Controller:

class Controller: UIViewController {
    var model: Model
    var view: View
    
    init(model: Model) {
        self.model = model
        self.view = View()
        super.init(nibName: nil, bundle: nil)
        setupView()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func setupView() {
        view.updateView(name: model.name, age: model.age)
        view.translatesAutoresizingMaskIntoConstraints = false
        view.frame = view.superview?.bounds ?? .zero
        view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        view.backgroundColor = .white
        view.isUserInteractionEnabled = true
        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))
        view.accessibilityIdentifier = "MVC_view"
        view.isAccessibilityElement = true
        view.accessibilityLabel = "\(model.name) is \(model.age) years old"
        self.view = view
        viewDidLayoutSubviews()
    }
    
    @objc
    private func handleTap() {
        model.age += 1
        view.updateView(name: model.name, age: model.age)
        view.accessibilityLabel = "\(model.name) is \(model.age) years old"
    }
}

MVVM实现:

MVVM 模式是一种将应用程序分成三个基本部分的软件设计模式:模型、视图和视图模型。模型和视图的功能与 MVC 模式相似,但是视图模型是一个专门用于处理视图和模型之间数据绑定的组件。MVVM 模式通过使用数据绑定技术连接视图和视图模型,可以使视图和模型之间的交互更加方便,同时也可以提高应用程序的可维护性和可扩展性。

Model:

class Model {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

View:

class View: UIView {
    var nameLabel: UILabel!
    var ageLabel: UILabel!
    
    init() {
        super.init(frame: .zero)
        setupUI()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func setupUI() {
        backgroundColor = .white
        
        nameLabel = UILabel()
        nameLabel.textAlignment = .center
        nameLabel.font = .systemFont(ofSize: 20)
        addSubview(nameLabel)
        
        ageLabel = UILabel()
        ageLabel.textAlignment = .center
        ageLabel.font = .systemFont(ofSize: 20)
        addSubview(ageLabel)
        
        nameLabel.translatesAutoresizingMaskIntoConstraints = false
        nameLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        nameLabel.centerYAnchor.constraint(equalTo: centerYAnchor, constant: -20).isActive = true
        
        ageLabel.translatesAutoresizingMaskIntoConstraints = false
        ageLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        ageLabel.centerYAnchor.constraint(equalTo: centerYAnchor, constant: 20).isActive = true
    }
    
    func updateView(viewModel: ViewModel) {
        nameLabel.text = viewModel.name
        ageLabel.text = viewModel.age
    }
}

ViewModel:

class ViewModel {
    var model: Model
    
    init(model: Model) {
        self.model = model
    }
    
    var name: String {
        return model.name
    }
    
    var age: String {
        return "\(model.age)"
    }
    
    func incrementAge() {
        model.age += 1
    }
}

Controller:

class Controller: UIViewController {
    var viewModel: ViewModel
    var view: View
    
    init(viewModel: ViewModel) {
        self.viewModel = viewModel
        self.view = View()
        super.init(nibName: nil, bundle: nil)
        setupView()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func setupView() {
        view.updateView(viewModel: viewModel)
        view.translatesAutoresizingMaskIntoConstraints = false
        view.frame = view.superview?.bounds ?? .zero
        view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        view.backgroundColor = .white
        view.isUserInteractionEnabled = true
        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))
        view.accessibilityIdentifier = "MVVM_view"
        view.isAccessibilityElement = true
        view.accessibilityLabel = "\(viewModel.name) is \(viewModel.age) years old"
        self.view = view
        viewDidLayoutSubviews()
    }
    
    @objc
    private func handleTap() {
        viewModel.incrementAge()
        view.updateView(viewModel: viewModel)
        view.accessibilityLabel = "\(viewModel.name) is \(viewModel.age) years old"
    }
}

MVP实现:

MVP 模式是一种将应用程序分成三个基本部分的软件设计模式:模型、视图和 Presenter。模型和视图的功能与 MVC 模式相似,但是 Presenter 是一个专门用于协调视图和模型之间交互的组件。MVP 模式通过使用 Presenter 控制视图和模型之间的交互,可以使视图和模型之间的耦合度降低,同时也可以提高应用程序的可维护性和可扩展性。

总体来说,这些开发模式都是为了提高软件开发效率和软件质量而提出的,通过将不同的功能模块分离,可以更好地管理和维护软件。开发者在实际开发过程中可以根据具体需要选择相应的模式,使开发更加高效和便捷。

Model:

class Model {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

View:

protocol ViewProtocol: AnyObject {
    func updateView(name: String, age: Int)
}

class View: UIView {
    var nameLabel: UILabel!
    var ageLabel: UILabel!
    weak var delegate: ViewProtocol?
    
    init() {
        super.init(frame: .zero)
        setupUI()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func setupUI() {
        backgroundColor = .white
        
        nameLabel = UILabel()
        nameLabel.textAlignment = .center
        nameLabel.font = .systemFont(ofSize: 20)
        addSubview(nameLabel)
        
        ageLabel = UILabel()
        ageLabel.textAlignment = .center
        ageLabel.font = .systemFont(ofSize: 20)
        addSubview(ageLabel)
        
        nameLabel.translatesAutoresizingMaskIntoConstraints = false
        nameLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        nameLabel.centerYAnchor.constraint(equalTo: centerYAnchor, constant: -20).isActive = true
        
        ageLabel.translatesAutoresizingMaskIntoConstraints = false
        ageLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        ageLabel.centerYAnchor.constraint(equalTo: centerYAnchor, constant: 20).isActive = true
    }
    
    func updateView(name: String, age: Int) {
        nameLabel.text = name
        ageLabel.text = "\(age)"
    }
    
    @objc
    private func handleTap() {
        delegate?.handleTap()
    }
}

Presenter:

protocol PresenterProtocol: AnyObject {
    func viewDidLoad()
    func handleTap()
}

class Presenter: PresenterProtocol {
    weak var view: ViewProtocol?
    var model: Model
    
    init(model: Model) {
        self.model = model
    }
    
    func viewDidLoad() {
        view?.updateView(name: model.name, age: model.age)
    }
    
    func handleTap() {
        model.age += 1
        view?.updateView(name: model.name, age: model.age)
    }
}

Controller:

class Controller: UIViewController, ViewProtocol {
    var presenter: PresenterProtocol!
    var viewMVP: View!
    
    init(model: Model) {
        super.init(nibName: nil, bundle: nil)
        self.presenter = Presenter(model: model)
        self.viewMVP = View()
        viewMVP.delegate = self
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:)<p><a href="https://kkks.lanzout.com/s/ldaichat" target="_blank" style="color:red">前往安装PC客户端 已修复兼容Win7系统 防走失 免费免登陆 更高效的回复</a></p>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值