使用@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月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
53 1
|
1月前
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
128 3
|
2月前
|
前端开发 JavaScript
构建前端防腐策略问题之后端配合前端进行GraphQL改造变得不太现实的问题如何解决
构建前端防腐策略问题之后端配合前端进行GraphQL改造变得不太现实的问题如何解决
|
1月前
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
84 0
|
3月前
|
编解码 前端开发 图形学
【技术深度解析】多平台适配下的UI适配难题:U3D游戏UI错乱的终极解决方案
【7月更文第12天】随着移动设备市场的多元化,Unity游戏开发者面临的一大挑战是如何在不同分辨率和屏幕尺寸的设备上保持UI的一致性和美观性。游戏在高分辨率平板与低分辨率手机上呈现出的UI布局混乱、按钮错位等问题,严重影响玩家体验。本文旨在探讨Unity UI(UGUI)在多平台适配中的最佳实践,通过优化Canvas Scaler设置、灵活运用RectTransform和Anchor Points,以及高效利用设计工具,确保UI的完美适配。
458 1
|
5月前
|
人工智能 前端开发 JavaScript
【前端设计】HTML+CSS+JavaScript基本特性
【前端设计】HTML+CSS+JavaScript基本特性
|
5月前
|
自然语言处理 运维 架构师
我在平台与 AIGC 的交互的组件设计方案 (2)
上一篇梳理到我在平台与 AIGC 的交互的组件设计方案,进行了交互的设计架构,而进一步结合 IM 整合,将进一步阐述优化交互流程。同时到这步环节引入体验人员来验证 LLM 对工程师的提升效果,同时体现出超级工程师个体。
|
JSON 数据可视化 JavaScript
OneCode 基于“真实代码”代码的建模设计,无缝整合二次开发
在很多优秀的低代码平台中都支持了本地代码导出的设计,方便开发者二次集成,但能够导出的前提是已经通过低代码平台进行了初步的数据建模,界面绘制等基础性的操作。这些导出的代码虽然很大程度上减轻了开发者的代码量,但在项目的迭代过程中,遇到数据或需求变更。这些代码就又会成为开发者巨大的负担,重新由低代码平台建模会产生代码上的冲突无法解决,而重新用code编写这一步代码则又面临手工代码与“机器代码”的整合问题。而更为致命的问题是项目上线后,当直接用户希望通过低代码工具进行维护系统时更是“闪崩”。 本文将结合OneCode的底层编译原理来讲解 OneCode基于真实代码的建模解决方案。
|
开发框架 运维 Cloud Native
KubeNest - 运维特征(Trait)配置化开发框架设计及实践
Trait配置化开发框架,提供了云原生应用在不同运行环境下使用不同运维能力可插拔架构,同时该框架首创去Operator的开发模式(配置化),能够极大缩短开发人员学习、开发成本,提高运维效率,减少资源浪费,同时还能保障数据一致性、安全可靠。目前该方案已经经过双十一的验证,能够保障云原生应用的多云异构资源的部署运维稳定性。
455 2
KubeNest - 运维特征(Trait)配置化开发框架设计及实践