设计模式

来源:互联网 发布:朝鲜水灾知乎 编辑:程序博客网 时间:2024/05/20 14:22

1. MVC(KVO简介)

MVC是面向对象程序设计应该遵守的规范,指的是模型-视图-控制器
模型:保存应用程序的数据
视图:所有继承了UIView的子类都被称为视图,负责与用户进行交互,并将Model的运行结果显示在屏幕上
控制器:用于协调模型于视图之间的关系

MVC的相互关系:
M和V两者不存在任何直接交互,只有M和C于V和C之间存在直接交互。M与C的交互是C向M发出需求,再有M做出响应。V和C的交互有三种方式:数据源(dataSource)、代理(delegate)和目标操作(target-action)。因为View是没有数据的,所以在View需要数据的时候会发出请求来获取所需要的数据,这种方式被称为数据源。第二种方式是代理:首先C成为V的代理对象,通过接受V发过来的代理信息,C就会做出相应的处理。第三种方法是目标操作:V发出action,C接受到以后会调用相应的函数和类向M发出要求。
当M的数据发生改变时,视图能动态的更新自己,及时显示数据模型更新后的数据,这时,就需要notification和KVO。
notification是需要发送一个notification对象来通知观察者,而KVO可以直接通知观察对象
KVO(Key Value Observing,键值监听)机制:

- (void)viewDidLoad {    [super viewDidLoad];    //初始化一个数据模型    _test = [[ZBTest alloc] init];    //给数据模型的name属性赋值    [_test setValue:@"zhubin" forKey:@"name"];    //给数据模型的name属性添加监听器,监听name属性的改变    [_test addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld context:nil];    //添加一个button,当点击button是,name的值发生变化    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 45)];    [self.view addSubview:button];    button.backgroundColor = [UIColor redColor];    [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];}- (void)click{    [_test setValue:@"aaaa" forKey:@"name"];}//当被监听的数据模型属性发生改变时,回调该方法- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{    NSLog(@"%@",keyPath);    NSLog(@"%@",object);    NSLog(@"%@",change);}- (void)dealloc{    //删除监听器    [_test removeObserver:self forKeyPath:@"name"];}

2. 通知

NSNotification 是Observer和Poster之间的信息传递。分为系统通知和自定义通知
NSNotificationCenter 实现了观察者模式,允许不同对象之间以松耦合的方式进行通信。
NSNotificationCenter 相当于一个消息中心,先由Observer在NSNotificationCenter 进行注册,表明该Observer对哪些NSNotification感兴趣。当Poster向NSNotificationCenter发送NSNotification后,所有在NSNotificationCenter上注册过并对该NSNotification感兴趣的Observer都会被激活

自定义通知的实现:

- (void)viewDidLoad {    [super viewDidLoad];    //实例化通知中心    NSNotificationCenter *notification = [NSNotificationCenter defaultCenter];    //添加一个通知监听器,用来监听name为“test”发出的通知    [notification addObserver:self selector:@selector(respond:) name:@"test" object:nil];    //点击按钮发送一个通知    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 45)];    button.backgroundColor = [UIColor redColor];    [button addTarget:self action:@selector(sendNotification) forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:button];}//接受到通知以后调用该方法- (void)respond:(NSNotification *) not{    //此处可以处理not(not包含userInfo和object两个属性) 来处理通知传过来的消息。    NSLog(@"就收到通知消息--%@",not.userInfo);}//发送通知- (void)sendNotification{    //实例化通知中心    NSNotificationCenter *notification = [NSNotificationCenter defaultCenter];    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"test",@"key", nil];    //创建通知,并指定userInfo信息    NSNotification *notifica = [NSNotification notificationWithName:@"test" object:nil userInfo:dict];    //发送通知    [notification postNotification:notifica];}

3. 协议和代理

协议

Objective—C中协议的作用就相当于其他语言中接口的作用。
协议分为非正式协议和正式协议
使用分类可以实现非正式协议
正式协议使用关键字:@protocol。
协议的定义格式:
@protocol 协议名:<父协议1,父协议2>
{
//定义协议的方法
}

协议的使用:
1. 协议支持多继承,一个协议可以继承多个父协议,但不能继承类
2. 协议中只定义方法名,可以是类方法,也可以是实例方法,但没有方法的实现。
3. 可以使用协议来定义变量,类似于其他语言中使用接口定义变量。

代理

协议体现的是一种规范,定义协议的类可以把协议定义的方法委托给实现了该协议的类来实现协议定义的方法,也就是当某个类实现了该协议,这个类就可以去实现该协议的方法(是否必须实现由协议中使用的两个关键字:@optional和@required决定)。当某个类使用该协议来定义变量,那么该类可以通过该变量调用协议里的方法。

4. 单例

单例的作用:在整个程序中,这个类只能被初始化一次,当有些资源需要全局共享时可以使用单例,UIApplication、NSUserDefaults等都是iOS中的系统单例。
单例的写法:
//线程安全(非线程安全只重写第一个方法就可以了)

//该静态变量用于保存自己创建的对象static myClass *aClass;+ (myClass *)sharedClass{    if (aClass == nil)    {        aClass = [[myClass alloc] init];    }    return aClass;}+ (id)allocWithZone:(NSZone *)zone{//注意:将onceToken设置为静态变量。    static dispatch_once_t onceToken;    //onceToken变量用于判断该代码是否已经执行过    dispatch_once(&onceToken, ^{        aClass = [super allocWithZone:zone];    });    //该队列底层的线程池控制在应用的某个生命周期内仅执行该函数一次    return aClass;}

5. 工厂

工厂方法:定义一个类用来负责创建其他类的实例,被创建的实例通常具有共同的父类。
工厂方法的实现:运用面向对象多态的特征,让继承父类的子类重写父类的某个方法,在方法内实例化子类并用父类来承接子类。从而实现返回的对象由当前对象的调用者所决定。

0 0
原创粉丝点击