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

使用@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-25 14:25:40

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

JavaScript开发规范 降低代码与XHTML耦合性

作为一名开发人员(WEB前端JavaScript开发),不规范的开发不仅使日后代码维护变的困难,同时也不利于团队的合作,通常还会带来代码安 全以及执行效率上的问题.本人在开发工作中就曾与不按规范来开发的同事合作过,与他合作就不能用"愉快"来形容了.现在本人撰写此文的目的除了与大家分享 一点点经验外,更多的是希望对未来的合作伙伴能够起到一定的借鉴作用.当然,如果我说的有不科学的地方还希望各路前辈多多指教.下面分条目列出各种规范要 求,这些要求都是针对同事编码毛病提出来的,好些行业约定的其

利用Nginx反向代理功能解决WEB网站80端口被封的解决方法_nginx

大陆的网络环境,都在天朝神兽的制度下让我等小P民悲剧一片:动不动就拔网线.封机房:现在更厉害的一招,从网关封杀你的80端口,一旦被封,网站域名就无法访问: 以上便废话,下面转入正题,其它就不帖了,直接给代码,利用nginx的反向代理功能,一般大家都很看懂,也不多记录了: [code] server { listen 80; server_name a.jb51.net; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOT

简易网页调色板功能调用代码

简易网页调色板功能调用代码 colorSelect('色值输入框ID','显示色值的容器ID',event)调用起来很简单,任何物品onClick就可以. 以下是HTML网页特效代码,点击运行按钮可查看效果: [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

Ajax上传图片及上传前先预览功能实例代码

手头上有几个小项目用到了easyUI,一开始决定使用easyUI就注定了项目整体上前后端分离,基本上所有的请求都采用Ajax来完成.在文件上传的时候用到了Ajax上传文件,以及图片在上传之前的预览效果,解决了这两个小问题,和小伙伴们分享下. 上传之前的预览 方式一 先来说说图片上传之前的预览问题.这里主要采用了HTML5中的FileReader对象来实现,关于FileReader对象,如果小伙伴们不了解,可以查看这篇文章HTML5学习之FileReader接口.我们来看看实现方式: <!DOCT

Java实现对中文字符串的排序功能实例代码_java

废话不多说了,直接给大家代码分享代码了. 具体代码如下所示: package test; /** * * @Title 书的信息类 * @author LR * @version . * @since -- */ public class Book { private String book_id; private String book_name; private String publishing_house; public Book(String book_id, String book_

如何用vb实现string类的indexof(substring)功能 求代码

问题描述 如何用vb实现string类的indexof(substring)功能 求代码 不要求调用vb中的indexof功能,而是自己写.应该是类似于把string变成chars()然后自己查找位置之类的,但是不会写,求大神 解决方案 最简单的 function foo(str as string, sfind as string) as integer dim i as integer dim r as integer r = -1 for i = 1 to len(str) - len(s

使用jdbc模仿hibernate功能制作持久化功能

问题描述 使用jdbc模仿hibernate功能制作持久化功能 解决方案 用到的技术无非就是读取配置文件,找到表和类的对应关系,以及字段和成员变量的对应关系. 然后反射获取这些变量,最后拼接成sql,调用jdbc,访问数据库.

移动端的手势缩放,求下列网址类似功能的代码,先谢过了

问题描述 移动端的手势缩放,求下列网址类似功能的代码,先谢过了 m.maoyan.com 的座位图选座这种效果,在线等,感谢各位 解决方案 https://github.com/chrisbanes/PhotoView这个开源项目你参照一下 解决方案二: https://github.com/chrisbanes/PhotoView这个开源项目你参照一下

radio button-C#编程 其中radioButton控件48个,button控件24个,请教各位大牛,如何简化编写,功能如下代码重复24次。

问题描述 C#编程 其中radioButton控件48个,button控件24个,请教各位大牛,如何简化编写,功能如下代码重复24次. 1C private void radioButton1_CheckedChanged(object sender EventArgs e) { if (radioButton1.Checked == true) button1.BackColor = Color.Red; } private void radioButton2_CheckedChanged(o