MVC

作者: GA_ | 来源:发表于2017-03-15 15:38 被阅读11次
    引言
     金三银四,又是一年找工作的好季节,工作中南面会把基础知识丢掉
     找工作的小伙伴,面试之前要认真复习基础知识才行。
    

    有很多程序员往往把框架模式和设计模式混淆,认为MVC是一种设计模式。实际上是完全不同的概念。MVC设计模式一般说的是MVC框架。

    框架模式: MVC,MVP等等;
    框架: C++语言的QT、MFC、gtk,Java语言的SSH 、SSI,php语言的 smarty(MVC模式),python语言的django(MTV模式)等等;
    设计模式:; 工厂模式、适配器模式、策略模式等等


    框架通常是代码重用,而设计模式是设计重用,架构则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。


    重用也分级别:

    • 内部重用,即在同一应用中能公共使用的抽象块;
    • 代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用;
    • 应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。
    MVC设计模式

    MVC设计模式一般说的是MVC框架,M指业务模型(Model),V指用户界面(View),C是控制器(Controller)。

    • Controller: 负责转发请求,队请求进行处理。处理事件并做出响应。
    • View: UI展示,实现数据显示。
    • Model: 处理数据和业务逻辑

    目的: 将M和V的代码分离,C确保M和V同步更新,M发生改变V跟着更新。

    优点:

    • 耦合性低
    • 重用性高
    • 生命周期成本低
    • 可维护性高

    缺点:

    • 对于简单界面使用MVC降低运行效率
    • V和M过于紧密相连,妨碍了各自独立的作用。
    官网MVC结构图
    //
    //  ViewController.swift
    //  GA_MVC
    //
    //  Created by houjianan on 2017/3/15.
    //  Copyright © 2017年 houjianan. All rights reserved.
    //
    
    import UIKit
    
    // Controller
    class ViewController: UIViewController {
    
        lazy var myView: MyView = {
            let v = MyView(frame: CGRect(x: 100, y: 100, width: 200, height: 40), handler: {
                [weak self] in
                if let weakSelf = self {
                    weakSelf.refreshData(name: "GA_清风又来")
                }
            })
            return v
        }()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            self.view.addSubview(myView)
            
            refreshData(name: "GA_清风自来")
        }
        
        private func refreshData(name: String) {
            // 模拟网络请求
            let time = DispatchTime.now() + Double(Int64(2 * 1000 * 1000000)) / Double(NSEC_PER_SEC)
            DispatchQueue.global().asyncAfter(deadline: time, execute: {
                let model = Model(name: name)
                DispatchQueue.main.async {
                    [weak self] in
                    if let weakSelf = self {
                        weakSelf.myView.model = model
                    }
                }
            })
        }
        
    }
    // View
    class MyView: UIView {
        // 别名闭包
        typealias Handler = () -> ()
        var handler: Handler!
        // 传入view的数据模型
        var model: Model? {
            didSet {
                //更新UI
                nameLabel.text = model?.name
            }
        }
        // 创建UI对象Label
        lazy var nameLabel: UILabel = {
            let l = UILabel(frame: self.bounds)
            l.textColor = UIColor.white
            l.textAlignment = .center
            self.addSubview(l)
            return l
        }()
      
        convenience init(frame: CGRect, handler: @escaping () -> ()) {
            self.init(frame: frame)
            createUI()
            self.handler = handler
        }
        
        private func createUI() {
            self.backgroundColor = UIColor.orange
            self.layer.borderColor = UIColor.brown.cgColor
            self.layer.borderWidth = 2.0
        }
        // view的点击事件,事件传到controller,可用:代理,通知,闭包。
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            self.handler()
        }
    }
    // Model
    class Model {
        var name: String!
        
        init(name: String) {
            self.name = "名字:" + name
        }
    }

    相关文章

      网友评论

          本文标题:MVC

          本文链接:https://www.haomeiwen.com/subject/awglnttx.html