使用@selector模仿代理功能降低代码耦合度

说明

该模式的好处就是两个产生联系的对象间并没有具体的耦合代码,增删改查均很直观

源码

Model

//
//  Model.h
//  SELMethod
//
//  Created by YouXianMing on 15/5/22.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <Foundation/Foundation.h>

#define SafePerformSelector(Stuff) do { _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") Stuff; _Pragma("clang diagnostic pop") } while (0)

@interface Model : NSObject

/**
 *  属性名字
 */
@property (nonatomic, strong)  NSString  *name;

/**
 *  设置代理与方法
 */
@property (nonatomic, weak) id    delegate;
@property (nonatomic)       SEL   method;

- (void)doSomeThing;

@end
//
//  Model.m
//  SELMethod
//
//  Created by YouXianMing on 15/5/22.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "Model.h"

@implementation Model

- (void)doSomeThing {

    // 执行代理以及方法
    if (_method && _delegate) {
        SafePerformSelector([_delegate performSelector:_method withObject:self]);
    }
}

@end

ViewController

//
//  ViewController.m
//  SELMethod
//
//  Created by YouXianMing on 15/5/22.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "Model.h"

@interface ViewController ()

@property (nonatomic, strong) Model *model;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 初始化对象
    self.model        = [Model new];
    self.model.name   = @"YouXianMing";

    // 设置代理与方法
    self.model.method   = @selector(modelValue:);
    self.model.delegate = self;

    // 执行操作
    [self.model doSomeThing];
}

- (void)modelValue:(Model *)value {
    NSLog(@"%@", value.name);
}

@end

细节

时间: 2024-10-10 11:39:51

使用@selector模仿代理功能降低代码耦合度的相关文章

callee关键字使用可降低代码耦合度

<script type="text/javascript"> //callee关键字使用 /* 求n的阶层的函数 n! = n*(n-1)! 5! = 5*4*3*2*1 4! = 4*3*2*1 3! = 3*2*1 2! = 2*1 1! = 1 */ function jiecheng(n){ if(n==1){ return 1; } else { //return n*jc(n-1); return n*arguments.callee(n-1); } } co

如何使用流媒体数据代理功能?

在“AnyChat Platform Core SDK V2.8”版本的SDK中,新增加了“用户流媒体数据代理功能”,使用该功能可以实现指定用户将其它用户的流媒体数据(音频.视频)做为自己的数据,转发给请求指定用户相关数据的用户. 应用场景:将指定用户(P)设置为其它用户(A)数据(音频.视频数据)的代理,当第三方用户(C)向指定用户(P)请求数据时,第三方用户(C)将会收到其它用户(A)的数据(音频.视频). 使用该功能,可以实现某些特殊的应用,如在会议直播的应用中,可以设置多个代理用户(P)

Mybatis Laz-Load功能实现代码赏析(原创)

对于Mybatis 拥有的Lazy Load(有中文翻译成延迟加载)功能,应该很同学都有听说过,今天主要与大家一起来解读一下Mybatis在Lazy Load功能的实现的代码.Lazy Load实现的功能很好理解,就是在数据与对象进行Mapping操作时,只有当真正使用该对象时,才进行Mapping操作,以减少不必要的数据库查询开销,从而提升了程序的效率. 首先就从配置部分讲起.(本文以Mybatis-3.0.5版本的源代码进行分析) 在配置SqlSessionFactoryBean时,需要指定

IOS中在自定义控件(非视图控制器)的视图跳转中 代理方法与代码块的比较

//代码块与代替代理的设计方法 我就以在自定义视图中(非视图控制器,不能实现视图控制功能),通过代理和代码块两种方法分别实现视图的跳转,进行对比 首先自定义了一个视图,上面有一个已经注册了得BUtton点击监控事件方法-(void)event{};视图的跳转就在这个方法中实现(注意:这个button不在视图控制器里面,就算导了相关头文件,也不能跳转,所以只能通过代理方法,或者代码块等,在这个button(在自定义控件空,非视图控制器)方法中调用相关方法,在视图控制器中去实现) 代理实现方法: 在

Nginx代理功能与负载均衡详解

Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Nginx代理服务的配置说明 1.上一篇中我们在http模块中有下面的配置,当代理遇到状态码为404时,我们把404页面导向百度. error_page 404 https://www.baidu.com; #错误页 然而这个配置,细心的朋友可以发现他并没有起作用. 如果我们想让他起作用,我们必须配合着下面的配置一起使用 p

Nginx反向代理功能

Nginx反向代理: 以入口点的方式接受来自客户端的请求,但是本身不存在任何数据,而是交由后端服务器进行处理后,再返回里客户端 请求            客户端发起请求------>代理服务器------------------------------>后端服务器 返回            后端服务器------------->代理服务器------------------------------>客户端 在这个过程客户端是不主动向后端服务器请求的,后端服务器也不直接向客户端返

EA强大功能之代码注释

前面讲了EA如何方便我们生成代码,这次讲一下,如何生成详细的注释. 1.文件表头注释 (1)点击工具----选项 在常规项里修改作者: 在代码工程中修改代码工程的默认语言. (2)修改文件模板 点击代码工厂模板以后如图: 修改语言--点击File,修改模板.点击保存.完成. 2.类表头注释:(以SqlUserDAL类为例) 修改类的信息,如图所示: 3.方法前注释 添加一个类的方法,填写齐全的信息.如图: 法前的注释主要是介绍本方法的功能以及参数,所以填写全这两个就行. 4.参数的注释 点击编辑

.Net Web产品中增加自己的功能和代码?

背景: 最近有一个项目,一个朋友找了一个网上比较成熟的CMS系统(动易),让我给他增加一些功能,这个产品功能挺多,但是没有源代码.按照以前的做法,就是直接反编译他的dll,生成源代码,然后在源代码的基础上修改和完善自己的功能.但是研究了一下这个产品,bin下面的DLL非常多,有主要的,还有辅助的.如果每个dll都反编译,简直不现实. ? 用发编译工具?ILSpy打开里面几个主要的dll,发现还加壳混淆了,用De4Dot反混淆出来.里面的代码还是非常清晰,但是如果每个dll都这样搞,岂不累死. ?

EA强大功能之代码凝视

前面讲了EA怎样方便我们生成代码,这次讲一下,怎样生成具体的凝视. 1.文件表头凝视 (1)点击工具----选项 在常规项里改动作者: 在代码project中改动代码project的默认语言. (2)改动文件模板 点击代码工厂模板以后如图: 改动语言--点击File,改动模板.点击保存.完毕. 2.类表头凝视:(以SqlUserDAL类为例) 改动类的信息,如图所看到的: 3.方法前凝视 加入一个类的方法,填写齐全的信息.如图: 法前的凝视主要是介绍本方法的功能以及參数,所以填写全这两个即可.