zoukankan      html  css  js  c++  java
  • 代理设计模式以及书写规范

    一、基本概念

    设计模式(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真正的导入一个协议的声明

  • 相关阅读:
    用addOnGlobalLayoutListener获取View的宽高
    用addOnGlobalLayoutListener获取View的宽高
    用addOnGlobalLayoutListener获取View的宽高
    ElasticSearch封装查询、多条件查询、模糊查询工具类
    java操作ElasticSearch(es)进行增删查改操作
    如何构建尽可能小的容器镜像?
    perl 合并日志处理+并发管理器
    NoSQL还是SQL?这一篇讲清楚
    perl 跨行匹配 /s
    perl 改变换行符 合并日志
  • 原文地址:https://www.cnblogs.com/hissia/p/5435848.html
Copyright © 2011-2022 走看看