iOS设计模式 - 中介者
原理图
说明
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
注:中介者对象本身没有复用价值,只是将逻辑操作封装在一个类里面而已
源码
https://github.com/YouXianMing/iOS-Design-Patterns
// // TextFieldMediator.h // MediatorPattern // // Created by YouXianMing on 15/10/26. // Copyright © 2015年 ZiPeiYi. All rights reserved. // #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface TextFieldMediator : NSObject <UITextFieldDelegate> @property (nonatomic, weak) UITextField *textField_1; @property (nonatomic, weak) UITextField *textField_2; @property (nonatomic, weak) UITextField *textField_3; @end
// // TextFieldMediator.m // MediatorPattern // // Created by YouXianMing on 15/10/26. // Copyright © 2015年 ZiPeiYi. All rights reserved. // #import "TextFieldMediator.h" @implementation TextFieldMediator - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if ([textField isEqual:self.textField_1]) { NSString *currentNum = [self currentStringWithTextField:textField replacementString:string inRange:range]; self.textField_2.text = [NSString stringWithFormat:@"%.f", currentNum.floatValue * 7]; self.textField_3.text = [NSString stringWithFormat:@"%.f", currentNum.floatValue * 14]; } else if ([textField isEqual:self.textField_2]) { NSString *currentNum = [self currentStringWithTextField:textField replacementString:string inRange:range]; self.textField_1.text = [NSString stringWithFormat:@"%.f", currentNum.floatValue / 7]; self.textField_3.text = [NSString stringWithFormat:@"%.f", currentNum.floatValue * 2]; } else { NSString *currentNum = [self currentStringWithTextField:textField replacementString:string inRange:range]; self.textField_1.text = [NSString stringWithFormat:@"%.f", currentNum.floatValue / 14]; self.textField_2.text = [NSString stringWithFormat:@"%.f", currentNum.floatValue / 2]; } return YES; } - (NSString *)currentStringWithTextField:(UITextField *)textField replacementString:(NSString *)string inRange:(NSRange)range { NSMutableString *mutableString = [NSMutableString stringWithString:textField.text]; if (string.length) { [mutableString insertString:string atIndex:range.location]; } else { [mutableString deleteCharactersInRange:range]; } return [NSString stringWithString:mutableString]; } @end
// // ViewController.m // MediatorPattern // // Created by YouXianMing on 15/10/26. // Copyright © 2015年 ZiPeiYi. All rights reserved. // #import "ViewController.h" #import "TextFieldMediator.h" @interface ViewController () <UITextFieldDelegate> @property (nonatomic, strong) UITextField *textField_1; @property (nonatomic, strong) UITextField *textField_2; @property (nonatomic, strong) UITextField *textField_3; @property (nonatomic, strong) TextFieldMediator *mediator; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 初始化控件 self.textField_1 = [self createTextFieldWithFrame:CGRectMake(10, 30 + 40 * 0, 250, 30)]; self.textField_2 = [self createTextFieldWithFrame:CGRectMake(10, 30 + 40 * 1, 250, 30)]; self.textField_3 = [self createTextFieldWithFrame:CGRectMake(10, 30 + 40 * 2, 250, 30)]; [self.view addSubview:self.textField_1]; [self.view addSubview:self.textField_2]; [self.view addSubview:self.textField_3]; // 初始化中介者 self.mediator = [[TextFieldMediator alloc] init]; self.mediator.textField_1 = self.textField_1; self.mediator.textField_2 = self.textField_2; self.mediator.textField_3 = self.textField_3; // 将代理设置成中介者 self.textField_1.delegate = self.mediator; self.textField_2.delegate = self.mediator; self.textField_3.delegate = self.mediator; } - (UITextField *)createTextFieldWithFrame:(CGRect)frame { UITextField *tmpField = [[UITextField alloc] initWithFrame:frame]; tmpField.layer.borderWidth = 0.5f; tmpField.keyboardType = UIKeyboardTypeNumberPad; return tmpField; } @end
细节