自学iOS开发小功能之五:代理设计模式以及书写规范

一、基本概念

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

代理设计模式:我们买电饭锅之类的,不会亲自到厂家去买,而是在商超等地方购买,而商超就是厂家的代理

应用场合:1、对象B想监听对象A的行为,让对象B成为对象A的代理

       2、对象A发生的事想告知对象B,让对象B成为对象A的代理

     3、对象A无法处理某些行为的时候,让对象B帮忙处理,即让对象B成为对象A的代理

二、代码

Student.h

 1 #import <Foundation/Foundation.h>
 2 //声明一个协议
 3 @class Student; //此处别落下
 4 @protocol StudentProtocol <NSObject>
 5 - (void)studentFindHouse:(Student *)student;//此处注意传递student
 6 @end
 7
 8 @interface Student : NSObject
 9 //学生需要找房子
10 - (void)findHouse;
11 //学生需要代理,注意用id
12 @property (strong, nonatomic)id<StudentProtocol> delegate;
13
14 @end

Student.m

#import "Student.h"
@implementation Student
- (void)findHouse
{
    NSLog(@"学生想找房子");
    //通知代理帮忙找房子,前提是拥有找房子的能力
    if ([self.delegate respondsToSelector:@selector(studentFindHouse:)]) {
        [self.delegate studentFindHouse:self];
    }
}
@end

LinkHome.h

1 #import <Foundation/Foundation.h>
2 #import "Student.h"  //此处本应该写@protocol StudentProtocol会更规范和好看一些,但不知道为啥会有警告找不到代理,不过程序正常运行
3 @interface LinkHome : NSObject <StudentProtocol> //遵守代理
4 @end

LinkHome.m

1 #import "LinkHome.h"
2 #import "Student.h"
3 @implementation LinkHome
4 - (void)studentFindHouse:(Student *)student
5 {
6     //必须实现代理的方法
7     NSLog(@"%s 帮忙找房子 ",__FUNCTION__);
8 }
9 @end

main.m

 1 main.m
 2 #import <Foundation/Foundation.h>
 3 #import "Student.h"
 4 #import "LinkHome.h"
 5 int main(int argc, const char * argv[]) {
 6     @autoreleasepool {
 7         Student *st = [[Student alloc] init];
 8         LinkHome *lh = [[LinkHome alloc] init];
 9         //学生找到LinkHome
10         st.delegate = lh;
11
12         [st findHouse];
13     }
14     return 0;
15 }

结果

2016-04-26 17:06:19.689 代理设计模式练习[4151:676544] 学生想找房子
2016-04-26 17:06:19.689 代理设计模式练习[4151:676544] -[LinkHome studentFindHouse:] 帮忙找房子
Program ended with exit code: 0

三、代理模式的书写规范

1.一般情况下, 当前协议属于谁, 我们就将协议定义到谁的头文件中。

2.协议的名称一般以它属于的那个类的类名开头, 后面跟上protocol。

3.协议中的方法名称一般以协议的名称protocol之前的作为开头。

4.一般情况下协议中的方法会将触发该协议的对象传递出去

5.一般情况下一个类中的代理属于的名称叫做 delegate

6.当某一个类要成为另外一个类的代理的时候, 一般情况下在.h中用@protocol 协议名称;告诉当前类 这是一个协议。 在.m中用#import真正的导入一个协议的声明

时间: 2024-10-12 20:18:08

自学iOS开发小功能之五:代理设计模式以及书写规范的相关文章

自学iOS开发小功能之六:UIApplication

一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplication对象,而且是单例的,如果试图在程序中新建一个UIApplication对象,那么将报错提示. (3)通过[UIApplication sharedApplication]可以获得这个单例对象. (4) 一个iOS程序启动后创建的第一个对象就是UIApplication对象,且只有一个. (5

自学iOS开发小功能之三:弹框的两种方式(iOS8.3之后新的方式,之前的已经弃用)

1.弹框出现在屏幕中间位置 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"是否退出" preferredStyle: UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActio

iOS开发小功能自学之二:分页(进行封装处理)

主要用Xib方式,代码后期还会有进一步的优化 下次用代码的时候一定要复制一份再用,直接拿出源代码来不小心哪里碰了下,耽误了10多分钟去找bug,郁闷!!! 功能:类似于手机打开新浪网首页最上面的大图片,自动滚动,右下角有个页数显示. 思路和注意点:1.主要用到的是scrollView和page control 2.在Xib中布置好控件 3.封装三部曲(首先在自定义构造方法内添加子控件,其次在layoutSubview中添加子控件的尺寸(此方法有随着外部尺寸变化,子控件尺寸比例随  着变化的动能)

iOS开发小功能之八:手势的简单使用(6种)以及代理方法

代码: 1 #import "ViewController.h" 2 @interface ViewController () <UIGestureRecognizerDelegate> 4 @property (weak, nonatomic) IBOutlet UIImageView *imageView; 5 @end 7 @implementation ViewController 8 - (void)viewDidLoad { 9 [super viewDidLo

iOS开发小功能的自学思路(弹出生日键盘为例)

1 #import "ViewController.h" 2 3 @interface ViewController () <UITextFieldDelegate> 4 @property (weak, nonatomic) IBOutlet UITextField *birthdayLabel; 5 @property (strong, nonatomic)UIDatePicker *datePicker; 6 7 @end 8 9 @implementation Vi

iOS开发小功能之九:五句代码搞定简单的父子控制器

小码哥大神的代码,确实精简! 1.最终结果如下面三个图,点击one,two,three,分别出现3个不同的控制器 直接代码:(三个控制器的创建就上了) #import "ViewController.h" #import "ZWOneViewController.h" #import "ZWTwoViewController.h" #import "ZWThreeViewController.h" @interface Vie

iOS开发小功能之十一:线程间的通信(3种方式)

三种方法都是通过touchesBegin监听屏幕的触摸实现 一.performSelector方式 1 #import "ViewController.h" 2 @interface ViewController () 3 @property (weak, nonatomic) IBOutlet UIImageView *imageView; 4 @end 5 @implementation ViewController 6 - (void)touchesBegan:(NSSet<

ios开发小知识2

http://blog.sina.com.cn/s/blog_66450b500102vadq.html http://www.cnblogs.com/lovesmile/archive/2012/06/27/2565569.html ios开发小知识2(转自cc) 退回输入键盘  - (BOOL)textFieldShouldReturn:(id)textField{    [textField resignFirstResponder];} CGRectCGRect frame = CGRe

ios开发小技巧-用宏化简代码

在IOS开发中,要做字典转模型一般情况如下: 1 /** 2 * 声明方法 3 */ 4 - (instancetype) initWithDictionary:(NSDictionary *)dict; 5 + (instancetype) carWithDictionary:(NSDictionary *)dict; 6 7 /** 8 * 实现方法 9 */ 10 - (instancetype)initWithDictionary:(NSDictionary *)dict 11 { 12