引言
金三銀四识窿,又是一年找工作的好季節(jié)斩郎,工作中南面會把基礎(chǔ)知識丟掉
找工作的小伙伴,面試之前要認(rèn)真復(fù)習(xí)基礎(chǔ)知識才行喻频。
有很多程序員往往把框架模式和設(shè)計(jì)模式混淆缩宜,認(rèn)為MVC是一種設(shè)計(jì)模式。實(shí)際上是完全不同的概念甥温。MVC設(shè)計(jì)模式一般說的是MVC框架锻煌。
框架模式: MVC,MVP等等姻蚓;
框架: C++語言的QT宋梧、MFC、gtk狰挡,Java語言的SSH 捂龄、SSI,php語言的 smarty(MVC模式)加叁,python語言的django(MTV模式)等等倦沧;
設(shè)計(jì)模式:; 工廠模式殉农、適配器模式刀脏、策略模式等等
框架通常是代碼重用,而設(shè)計(jì)模式是設(shè)計(jì)重用超凳,架構(gòu)則介于兩者之間愈污,部分代碼重用,部分設(shè)計(jì)重用轮傍,有時(shí)分析也可重用暂雹。
重用也分級別:
- 內(nèi)部重用,即在同一應(yīng)用中能公共使用的抽象塊;
- 代碼重用创夜,即將通用模塊組合成庫或工具集杭跪,以便在多個(gè)應(yīng)用和領(lǐng)域都能使用;
- 應(yīng)用框架的重用,即為專用領(lǐng)域提供通用的或現(xiàn)成的基礎(chǔ)結(jié)構(gòu)涧尿,以獲得最高級別的重用性系奉。
MVC設(shè)計(jì)模式
MVC設(shè)計(jì)模式一般說的是MVC框架,M指業(yè)務(wù)模型(Model)姑廉,V指用戶界面(View)缺亮,C是控制器(Controller)。
- Controller: 負(fù)責(zé)轉(zhuǎn)發(fā)請求桥言,隊(duì)請求進(jìn)行處理萌踱。處理事件并做出響應(yīng)。
- View: UI展示号阿,實(shí)現(xiàn)數(shù)據(jù)顯示并鸵。
- Model: 處理數(shù)據(jù)和業(yè)務(wù)邏輯
目的: 將M和V的代碼分離,C確保M和V同步更新扔涧,M發(fā)生改變V跟著更新园担。
優(yōu)點(diǎn):
- 耦合性低
- 重用性高
- 生命周期成本低
- 可維護(hù)性高
缺點(diǎn):
- 對于簡單界面使用MVC降低運(yùn)行效率
- V和M過于緊密相連,妨礙了各自獨(dú)立的作用枯夜。
官網(wǎng)MVC結(jié)構(gòu)圖
//
// 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_清風(fēng)又來")
}
})
return v
}()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(myView)
refreshData(name: "GA_清風(fēng)自來")
}
private func refreshData(name: String) {
// 模擬網(wǎng)絡(luò)請求
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的數(shù)據(jù)模型
var model: Model? {
didSet {
//更新UI
nameLabel.text = model?.name
}
}
// 創(chuàng)建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的點(diǎn)擊事件粉铐,事件傳到controller,可用:代理卤档,通知,閉包程剥。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.handler()
}
}
// Model
class Model {
var name: String!
init(name: String) {
self.name = "名字:" + name
}
}