• Objective-C之代理设计模式小实例


    代理设计模式小实例

    协议的应用场景之一:代理模式

    需求:

    用代理实现学生找房子, 不具备找房子的能力
    所以学生可以找另一个对象来帮它找房子, 那么另一个对象就是学生的代理

    UML类图:

    类图关系分析:

    + 两个对象:Student(学生用户),LinkHouse(代理者)
    + LinkHouse是属于Student的代理,所以这里是(has a)拥有的组合关系
        + 所以:LinkHouse对象可以作为Student类里的一个对象数据类型的属性
        + 另外:因为不确定代理的具体类型,用id万能数据类型作为属性的声明类型
        + 在这里id数据类型后面需要<代理的名称>,例:id <LinkHouse>。
            - 协议写在数据类型的右边, 明确的标注如果想给该变量赋值, 那么该对象必须遵守某个协议

    代码使用代理需要注意的地方

    • Student的需求方法中(这里是findHouse找房子的行为)调用代理者(LinkHouse)的所能提供的方法(比如findHouse,要是这个代理不能满足需求用户的需求,那留他有啥用)

    • 协议一般都是需求用户提出来的协议,比如我去相亲,对对方我心里肯定或多或少对对方有一些基本要求(比如会洗衣服做饭什么的),这些就是我提出来的协议。所以要遵循协议的编写规范(比如:一般情况下, 当前协议属于谁, 我们就将协议定义到谁的头文件中)

    • 协议的编写规范:

      • 1.一般情况下, 当前协议属于谁, 我们就将协议定义到谁的头文件中
      • 2.协议的名称一般以它属于的那个类的类名开头, 后面跟上protocol或者delegate
      • 3.协议中的方法名称一般以协议的名称protocol之前的作为开头
      • 4.一般情况下协议中的方法会将触发该协议的对象传递出去
      • 5.一般情况下一个类中的代理属于的名称叫做 delegate
      • 6.当某一个类要成为另外一个类的代理的时候, 一般情况下在.h中用@protocol 协议名称;告诉当前类 这是一个协议.在.m中用#import真正的导入一个协议的声明

    接下来进入实例代码阶段:

    Student.h代码:

     1 #import <Foundation/Foundation.h>
     2 #import "StudentFindHouse.h"
     3 @class LinkHouse;
     4 
     5 @interface Student : NSObject
     6 
     7 @property (nonatomic,strong)id<StudentFindHouse> delegate;
     8 
     9 -(void)findHouse;
    10 
    11 @end

    Student.m代码:

     1 #import "Student.h"
     2 #import "LinkHouse.h"
     3 
     4 @implementation Student
     5 
     6 -(void)findHouse{
     7     if ([self.delegate respondsToSelector:@selector(findHouse)]) {
     8         [self.delegate findHouse];
     9     }
    10 }
    11 
    12 @end

    然后写出Student的类的协议,StudentFindHouse.h:

    1 #import <Foundation/Foundation.h>
    2 
    3 @protocol StudentFindHouse <NSObject>
    4 
    5 -(void)findHouse;
    6 
    7 @end

    LinkHouse.h代码:

    1 #import <Foundation/Foundation.h>
    2 
    3 #import "StudentFindHouse.h"
    4 
    5 @interface LinkHouse : NSObject <StudentFindHouse>
    6 
    7 -(void)findHouse;
    8 
    9 @end

    LinkHouse.m代码:

    1 #import "LinkHouse.h"
    2 
    3 @implementation LinkHouse 
    4 
    5 -(void)findHouse{
    6     NSLog(@"%s 帮student找房子。",__FUNCTION__);
    7 }
    8 
    9 @end

    main.m代码以及然后运行的结果:

     
     
     
     
  • 相关阅读:
    sqoop常用命令三 ---- import导入 与export 覆盖更新,常见问题总结
    Sqoop 数据导出:全量、增量、更新
    idea 安装热部署插件
    Python学习之turtle绘图篇
    使用python自动画一只小猪佩奇(源码)
    Python turtle安装和使用教程
    PYCHARM三方库安装方法
    Impala编译部署-3
    SSLv3 SSLContext not available Tomcat
    SSLv3 SSLContext not available Tomcat
  • 原文地址:https://www.cnblogs.com/goodboy-heyang/p/4935886.html
Copyright © 2020-2023  润新知