MVC
2017-03-15 本文已影响11人
GA_
引言
金三银四,又是一年找工作的好季节,工作中南面会把基础知识丢掉
找工作的小伙伴,面试之前要认真复习基础知识才行。
有很多程序员往往把框架模式和设计模式混淆,认为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过于紧密相连,妨碍了各自独立的作用。
//
// 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
}
}