MVC的学习和使用
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。
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