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代码以及然后运行的结果:


相关文章
|
5月前
|
设计模式 缓存 安全
【设计模式】单例模式:确保类只有一个实例
【设计模式】单例模式:确保类只有一个实例
51 0
|
5月前
|
设计模式 XML JSON
二十三种设计模式全面解析-代理模式进阶篇:揭秘远程代理
二十三种设计模式全面解析-代理模式进阶篇:揭秘远程代理
129 0
|
12月前
|
设计模式 安全 Java
JAVA设计模式1:单例模式,确保每个类只能有一个实例
JAVA设计模式1:单例模式,确保每个类只能有一个实例
100 0
|
设计模式 缓存 安全
设计模式之代理模式的懂静态代理和动态代理
设计模式之代理模式的懂静态代理和动态代理
121 0
|
12天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
9天前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
|
4月前
|
设计模式 安全 Java
Java中的单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点
Java单例模式确保类仅有一个实例,并提供全局访问点。常见实现包括: - 饿汉式:静态初始化,线程安全。 - 懒汉式:延迟初始化,需同步保证线程安全。 - 双重检查锁定:优化懒汉式,减少同步开销。 - 静态内部类:延迟加载,线程安全。 - 枚举:简洁线程安全,不适用于复杂构造。 - 容器实现:如Spring框架,用于依赖注入。选择依据需求,如延迟加载、线程安全和扩展性。
64 10
|
3月前
|
设计模式 缓存 JavaScript
js设计模式实例
【7月更文挑战第2天】JavaScript设计模式包含工厂、单例、建造者、抽象工厂和代理模式等,它们是最佳实践和可重用模板,解决创建、职责分配和通信等问题。例如,工厂模式封装对象创建,单例确保全局唯一实例,建造者模式用于复杂对象构建,抽象工厂创建相关对象集合,而代理模式则控制对象访问。这些模式提升代码质量、可读性和灵活性,是高效开发的关键。
30 0
|
5月前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
|
设计模式 缓存 Java
代理设计模式解读(下)
代理设计模式解读(下)