iOS设计模式 - 中介者

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

细节

时间: 2025-01-02 13:23:44

iOS设计模式 - 中介者的相关文章

iOS设计模式 - 适配器

iOS设计模式 - 适配器   效果   说明 1. 为了让客户端尽可能的通用,我们使用适配器模式来隔离客户端与外部参数的联系,只让客户端与适配器通信. 2. 本教程实现了适配器模式的类适配器与对象适配器两种模式,各有优缺点. 3. 如果对面向对象基本原理以及设计模式基本原理不熟悉,本教程会变得难以理解.   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // BusinessCardView.h // Adapter // /

iOS设计模式 - 桥接

iOS设计模式 - 桥接   示意图   说明 1. 桥接模式为把抽象层次结构从实现中分离出来,使其可以独立变更,抽象层定义了供客户端使用的上层抽象接口,实现层次结构定义了供抽象层次使用的底层接口,实现类的引用被封装于抽象层的实例中,桥接就形成了. 2. 桥接模式可以解决具有功能类似但又不完全相同的某种功能架构,为了能让实现更加灵活.   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // ConsoleController.h

iOS设计模式 - 策略

iOS设计模式 - 策略   效果   说明 1. 把解决相同问题的算法抽象成策略(相同问题指的是输入参数相同,但根据算法不同输出参数会有差异) 2. 策略被封装在对象之中(是对象内容的一部分),策略改变的是对象的内容.如果从外部扩展了对象的行为,就不叫策略模式,而是装饰模式. 3. 策略模式可以简化复杂的判断逻辑(if - else) 4. 如果对面向对象基本原理以及设计模式基本原理不熟悉,本教程会变得难以理解.   源码 https://github.com/YouXianMing/iOS-

iOS设计模式 - 代理

iOS设计模式 - 代理   原理图   说明 1. 代理模式大家都用过,但用抽象基类NSProxy实现代理估计鲜有人用 2. 本人用NSProxy实现了代理模式,对于理解消息转发机制有点帮助   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // AbstractProxy.h // AppProxy // // Created by YouXianMing on 15/8/4. // Copyright (c) 2015年

iOS设计模式 - 备忘录

iOS设计模式 - 备忘录   原理图   说明 1. 在不破坏封装的情况下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态 2. 本人已经将创建状态与恢复状态的逻辑抽象成了协议,并配合备忘录中心一起使用   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // MementoCenter.h // MementoPattern // // Created by YouXianMin

iOS设计模式 - 责任链

iOS设计模式 - 责任链   原理图   说明 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任.   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // ChainOfResponsibilityProtocol.h // C

iOS设计模式 - 外观

iOS设计模式 - 外观   原理图     说明 1. 当客服端需要使用一个复杂的子系统(子系统之间关系错综复杂),但又不想和他们扯上关系时,我们需要单独的写出一个类来与子系统交互,隔离客户端与子系统之间的联系,客户端只与这个单独写出来的类交互 2. 外观模式实质为为系统中的一组接口提供一个统一的接口,外观定义了一个高层接口,让子系统易于使用   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // ShapeMaker.h /

iOS设计模式 - 生成器

iOS设计模式 - 生成器   原理图   说明 1. 将构建复杂对象的过程拆分成一个一个的模块,通过统一的指导者来指导对象的构建过程称之为生成器模式 2. 生成器模式适合用于构建组合的对象   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // CarBuilder.h // BuilderPattern // // Created by YouXianMing on 15/9/14. // Copyright (c) 201

iOS设计模式 - 模板

iOS设计模式 - 模板   原理图   说明 定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤.   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // GameProtocol.h // TemplatePattern // // Created by YouXianMing on 15/10/27. // Copyright 2015年 ZiPeiYi.