使用@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

细节

目录
相关文章
|
1月前
|
数据采集 安全 数据安全/隐私保护
代理IP在语言模型驱动的软件开发中的应用与展望
本文探讨了代理IP技术在语言模型驱动的软件开发中的应用。通过案例和代码展示,详细介绍了代理IP的工作原理及其在数据收集、隐私保护、智能开发流程等方面的作用,展望了未来软件开发的智能化趋势。
25 2
代理IP在语言模型驱动的软件开发中的应用与展望
|
8月前
|
前端开发 JavaScript UED
第五章(原理篇) 微前端技术之模块联邦与动态加载
第五章(原理篇) 微前端技术之模块联邦与动态加载
340 0
|
8月前
|
资源调度 前端开发 JavaScript
第十章(应用场景篇) Single-SPA微前端架构深度解析与实践教程
第十章(应用场景篇) Single-SPA微前端架构深度解析与实践教程
278 0
|
5月前
|
前端开发 API 开发者
【前端数据革命】React与GraphQL协同工作:从理论到实践全面解析现代前端数据获取的新范式,开启高效开发之旅!
【8月更文挑战第31天】本文通过具体代码示例,介绍了如何利用 GraphQL 和 React 搭建高效的前端数据获取系统。GraphQL 作为一种新型数据查询语言,能精准获取所需数据、提供强大的类型系统、统一的 API 入口及实时数据订阅功能,有效解决了 RESTful API 在复杂前端应用中遇到的问题。通过集成 Apollo Client,React 应用能轻松实现数据查询与实时更新,大幅提升性能与用户体验。文章详细讲解了从安装配置到查询订阅的全过程,并分享了实践心得,适合各层次前端开发者学习参考。
50 0
|
4月前
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
192 0
|
8月前
|
前端开发 网络协议 程序员
软件开发过程中,速度和质量的追求与统一,完美app基本特性。
软件开发过程中,速度和质量的追求与统一,完美app基本特性。
44 0
|
8月前
|
人工智能 前端开发 JavaScript
【前端设计】HTML+CSS+JavaScript基本特性
【前端设计】HTML+CSS+JavaScript基本特性
|
8月前
|
监控 负载均衡 Dubbo
Dubbo 模块探秘:深入了解每个组件的独特功能【二】
Dubbo 模块探秘:深入了解每个组件的独特功能【二】
134 0
|
8月前
|
开发工具 git
uniapp项目实践拓展章:代码统一风格
uniapp项目实践拓展章:代码统一风格
131 0
|
开发框架 运维 Cloud Native
KubeNest - 运维特征(Trait)配置化开发框架设计及实践
Trait配置化开发框架,提供了云原生应用在不同运行环境下使用不同运维能力可插拔架构,同时该框架首创去Operator的开发模式(配置化),能够极大缩短开发人员学习、开发成本,提高运维效率,减少资源浪费,同时还能保障数据一致性、安全可靠。目前该方案已经经过双十一的验证,能够保障云原生应用的多云异构资源的部署运维稳定性。
495 2
KubeNest - 运维特征(Trait)配置化开发框架设计及实践