欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

MVC的学习和使用

程序员文章站 2022-07-06 13:00:34
MVC模式是软件工程中的一种软件架构模式。把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。Model: 程序的数据部分,用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法;View: 程序的界面展示,实际上是数据有目的的界面显示,但视图绝不与model直接交互,在视图中一般没有程序上的逻辑;Controller: 将Model与View连接起来协同工作的部分,控制器起到不同层面间的组织作用,用于控制应用程序的流程。......

MVC模式是软件工程中的一种软件架构模式。

把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
Model: 程序的数据部分,用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法;
View: 程序的界面展示,实际上是数据有目的的界面显示,但视图绝不与model直接交互,在视图中一般没有程序上的逻辑;
Controller: 将Model与View连接起来协同工作的部分,控制器起到不同层面间的组织作用,用于控制应用程序的流程。

其优点

MVC使得程序的输入、处理和输出强制性的分开,这增加了软件的扩展性、维护性以及封装性,使得软件开发从不同层面上分离解耦。直接描述这些优点可能看着会很晦涩,举几个例子来说明一下:1.几个界面可以共用一个model,这使得model可复用,同时只有model的一个拷贝使得代码更易于维护;
2.当模型,数据与控制器是相分离的时候,改变业务规则就变得很容易,数据的存储可以随意的迁移,因为模型对控制器的接口是不变的,这样界面仍然可以正确的展示,界面UI也是可以任意改变,因为它只关心界面不会影响到其他;
3.MVC这样将三方独立的区分开,也绝对的有利于多人或者团队开发。

缺点

虽然MVC有着那么多优点,并且我们的项目也采用这样的开发模式,但是他的缺点也很明显,严格的三者分离有时候是很难区分的,需要仔细的思考确定边界,同时Model与View不能直接交互,就必然在性能上有一些损失(极小),并且在写一些小型的项目时,可能会花费大量的时间和空间来

  View——顾名思义,就是存放视图使用的。对应上面的例子,我们应该把T1、T2、B1和B2放在View上,对吧?

  Model——即模型。模型一般都有很好的可复用性,统一管理一些数据。在上面的例子中,数据库是不是可以作为一个模型呢?答案是肯定的。所以,我们就把数据库的所有操作都放在Model里面执行——包括但不限于数据库的创建、插入、查询、更新和删除(为啥都放一起?地球人都知道。。。)

 Controller——控制器,充当一个CPU的功能,即该应用程序所有的工作都由Controller统一调控。它负责处理View和Model的事件。具体怎么调控和处理?在下面的MVC原理里面,我们将详细讲解。

MVC之间的交流模式
上面的内容中,已经详细描述了model、view和controller之间如何各司其职(即该是谁的东西,谁就要保护好,不能让另外一个越俎代庖的去处理)。MVC模式虽然是iOS编程中使用最广泛的模式,但论起复杂程度,MVC模式可以算是众多设计模式之首。通常情况下,MVC模式需要综合使用target-action模式、delegate模式、Notification或KVO模式等。下图是斯坦福大学的iOS一堂关于iOS介绍的公开课上所使用的示例图,这张图像也生动的描绘出来了MVC模式的工作原理,接下来的原理讲解也是依托于这张图像:

1、 Controller和View之间可以通信,Controllor通过outlet(输出口)控制View,View可以通过target-action、delegate或者data source(想想UITableVeiwDatasource)来和Controller通信;

2、 Controller在接收到View传过来的交互事件(View就是完成让人和程序的交互的呀,比如按B1按钮)之后,经过一些判断和处理,把需要Model处理的事件递交给Model处理(比如刚才的例子中的保存到数据库),Controller对Model使用的是API;

3、 Model在处理完数据之后,如果有需要,会通过Notification或者KVO的方式告知Controller,事件已经处理完,Controller再经过判断和处理之后,考虑下一步要怎么办(是默默无闻的在后台操作,还是需要更新View,这得看Controller的“脸色”行事)。这里的无线天线很有意思,Model只负责发送通知,具体谁接收这个通知并处理它,Model并不关心,这一点非常重要,是理解Notification模式的关键。

4、 Model和View之间不直接通信!

登陆注册demo

1、在新建的Xcode文件中新增三个文件夹,分别为M, V, C;
2、新建一个名为VView的类,继承自UIView。
新建一个名为MModel的类,继承自NSObject。
新建一个名为CController的类,继承自UIViewController。MVC的学习和使用
LandView中的代码主要是显示在屏幕上,方便用户直接观看的界面,所以声明两个UITextField和两个UIButton。里面只包括位置,颜色,风格等细节,具体点击事件放在C中执行。

uiview.h文件
@interface LandView : UIView

@property (nonatomic, strong) UIButton *LandButton;
@property (nonatomic, strong) UIButton *RegisterButton;
@property (nonatomic, strong) UITextField *nameTextfield;
@property (nonatomic, strong) UITextField *passTextfield;

- (void)viewInit;

model界面主要进行把数据库的所有操作都放在Model里面执行。

.h文件
@interface LandModel : NSObject

@property (nonatomic, strong) NSMutableArray *nameArray;
@property (nonatomic, strong) NSMutableArray *passArray;

- (void)modelInit;
.m文件
- (void)modelInit {
    _nameArray = [[NSMutableArray alloc] init];
    _passArray = [[NSMutableArray alloc] init];
    [_nameArray addObject:@"111"];
    [_passArray addObject:@"222"];
}

控制器,充当一个CPU的功能,即该应用程序所有的工作都由Controller统一调控。它负责处理View和Model的事件

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector((pressSucessful)) name:@"sucessful" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pressDefault) name:@"default" object:nil];
    
    _landView = [[LandView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    [self.view addSubview:_landView];
    //执行landview里的方法
    [_landView viewInit];
    [_landView.LandButton addTarget:self action:@selector(pressLand) forControlEvents:UIControlEventTouchUpInside];
    [_landView.RegisterButton addTarget:self action:@selector(pressRegister) forControlEvents:UIControlEventTouchUpInside];
    
    _landmodel = [[LandModel alloc] init];
    [_landmodel modelInit];
    
}

- (void)pressSucessful {
    ViewController *view1 = [[UIViewController alloc] init];
    view1.view.backgroundColor = [UIColor blackColor];
    [self presentViewController:view1 animated:YES completion:nil];
}

- (void)pressDefault {
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"错误" message:@"账号或密码输入错误" preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *suretAction = [UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:nil];
    [alertController addAction:suretAction];
    [self presentViewController:alertController animated:YES completion:nil];
}

-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self.view endEditing:YES];
}

后面Register方法和上面Land方法其实大同小异,就多了个协议委托传值,这里就不再展开了。

本文地址:https://blog.csdn.net/weixin_45708424/article/details/108683431