美文网首页
谈谈我现在使用的设计模式

谈谈我现在使用的设计模式

作者: 我要在河边钓一整天的鱼 | 来源:发表于2017-09-19 12:16 被阅读574次

1、传统的MVC

1.png

可以看出另外每个实体都知道另外两个实体,这显然降低了可重用性当然也不是您在开发中想要的。

2、苹果的MVC

2.png

这里View和Model的关系剪断,但是在Controller中会变得很臃肿,Controller中代码量会变得很大。想想将业务逻辑、网络请求、View状态改变还有把addSubView的代码也放在Controller中的,看了眼要修改的Controller是不是想死的心都有了。

3、我的MVC

设计模式不是死,根据自己的需求和理解进行一些改变是必要的,再变也是万变不离其宗,现在的项目的使用的MVC实际上就是对Controller的瘦身。上图是取自iOS Architecture Patterns,这里我直接说我的实现。

我的目录是根据模块进行分解然后在模块目录下创建MVC的文件夹,我不喜欢大的MVC文件目录然后吧相关的类放进对应的文件夹下的。


3.png

Model

和你所知MVC中的M是一样的

/
//  Model.swift
//  Test
//
//  Created by 小七 on 2017/9/19.
//  Copyright © 2017年 Seven. All rights reserved.
//

import UIKit

struct Model {
    var name: String?
}

View

我不会在Controller中写addSunViews这样的代码, 所以这样的代码全在封装带View中了,这里用的Storyboard。我将storyboard放在Controller中纯属个人习惯,我个人认为这个是属于View的

//
//  TableViewCell.swift
//  Test
//
//  Created by 小七 on 2017/9/19.
//  Copyright © 2017年 Seven. All rights reserved.
//

import UIKit

class MyTableViewCell: UITableViewCell {

    @IBOutlet weak var label: UILabel!
    
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

Controller

Controller中含有Request和C->V的数值传递类, 在实际项目中将一部分的业务逻辑代码放在了ViewModel中了(这里的ViewModel并不是MVVM中所表达的意思,只是借鉴了一些思路)

//
//  ViewController.swift
//  Test
//
//  Created by 小七 on 2017/9/19.
//  Copyright © 2017年 Seven. All rights reserved.
//

import UIKit

class ViewController: UITableViewController {

    lazy private var mViewModel: ViewModel = ViewModel()
    lazy private var mRequest: Request = Request()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        mRequest.request {[weak self] in
            self?.tableView.reloadData()
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        
    }
    
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return mRequest.list.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MyTableViewCell", for: indexPath) as! MyTableViewCell
        mViewModel.loadCellWithModel(mRequest.list[indexPath.row], view: cell)
        return cell
    }
}

ViewModel

这里做了数据的传递

//
//  ViewModel.swift
//  Test
//
//  Created by 小七 on 2017/9/19.
//  Copyright © 2017年 Seven. All rights reserved.
//

import UIKit

class ViewModel: NSObject {
    
    func loadCellWithModel(_ model: Model, view: MyTableViewCell) {
        view.label.text = model.name
    }
    
}

Request

网络请求的封装和Model的储存,我的Controller中是不储存Model的

//
//  Request.swift
//  Test
//
//  Created by 小七 on 2017/9/19.
//  Copyright © 2017年 Seven. All rights reserved.
//

import UIKit

class Request: NSObject {
    
    var list: [Model] = [Model]()
    
    func request(result: () -> Void){
        for _ in  0 ... 20 {
            var m = Model()
            m.name = "12345"
            list.append(m)
        }
        result()
    }
    
}

后语

实际上MVVM和MVP可以也可以解决C过于臃肿的问题。那为什么没有使用流行的MVVM呢,因为MVVM的实现离不开RX和RAC,主要项目中没有使用它们所以就没有直接引入MVVM(这个理由确实牵强 = =!),还有建议使用的所有第三方库最好自己进行封装下,不然在换库的时候会留下悔恨的泪水。

git地址go go

谢谢观赏,这里是我在项目中对MVC的理解,希望多多指正

参考 iOS Architecture Patterns

相关文章

  • 谈谈我现在使用的设计模式

    1、传统的MVC 可以看出另外每个实体都知道另外两个实体,这显然降低了可重用性当然也不是您在开发中想要的。 2、苹...

  • 设计模式之工厂方法模式

    在上篇文章设计模式之模板方法模式中谈到如何使用模板方法模式设计审批流程及其优点,本篇文章将谈谈如何使用工厂模式创建...

  • 第十三章、设计模式相关

    一、谈谈对设计模式的理解。你知道哪些设计模式,并简要叙述。 使用设计模式的目的:为了代码可重用性、让代码更容易被他...

  • 10.Spring中用到的设计模式

    面试官:“谈谈 Spring 中都用到了哪些设计模式” 工厂模式 : Spring 使用工厂模式通过 BeanFa...

  • 谈谈模板方法设计模式的使用

    在项目中经常会遇到一个类的某些方法和另一个类的某些方法功能是相同的,只有部分方法是不同的。这个时候就可以使用模板方...

  • Java设计模式

    设计模式的优点: 1 设计模式(Design pattern)是一套被反复使用、代码设计经验的总结。使用设计模式...

  • 谈谈设计模式

    六大设计原则 单一职责原则 依赖倒置原则 开闭原则 接口隔离原则 里氏替换原则 迪米特法则 单一职责原则 一个类只...

  • 谈谈Maven Archetype的设计和使用

    谈谈Maven Archetype的设计和使用

  • 大话23种设计模式

    本篇文章为一个系列,主要深入浅出的谈谈设计模式设计,以方便我们在开发时候真正使用,而非为了面试才去学习。 1.设计...

  • 谈谈23种设计模式在Android源码及项目中的应用

    谈谈23种设计模式在Android源码及项目中的应用 本文首发于个人博客:Lam's Blog - 谈谈23种设计...

网友评论

      本文标题:谈谈我现在使用的设计模式

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