https://github.com/YouXianMing

iOS设计模式 - 策略

iOS设计模式 - 策略

 

效果

 

说明

1. 把解决相同问题的算法抽象成策略(相同问题指的是输入参数相同,但根据算法不同输出参数会有差异)

2. 策略被封装在对象之中(是对象内容的一部分),策略改变的是对象的内容.如果从外部扩展了对象的行为,就不叫策略模式,而是装饰模式.

3. 策略模式可以简化复杂的判断逻辑(if - else)

4. 如果对面向对象基本原理以及设计模式基本原理不熟悉,本教程会变得难以理解.

 

源码

https://github.com/YouXianMing/iOS-Design-Patterns

//
//  InputValidator.h
//  StrategyPattern
//
//  Created by YouXianMing on 15/7/26.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

#define  EMPTY_INPUT  @"输入为空"

@interface InputValidator : NSObject

/**
 *  抽象策略
 *
 *  @param input 当前输入textField
 *
 *  @return 输入验证是否合法
 */
- (BOOL)validateInput:(UITextField *)input;

/**
 *  错误信息
 */
@property (nonatomic, strong) NSString *errorMessage;

@end
//
//  InputValidator.m
//  StrategyPattern
//
//  Created by YouXianMing on 15/7/26.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "InputValidator.h"

@implementation InputValidator

- (BOOL)validateInput:(UITextField *)input {

    return NO;
}

@end
//
//  CustomField.h
//  StrategyPattern
//
//  Created by YouXianMing on 15/7/26.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "InputValidator.h"

@interface CustomField : UITextField

/**
 *  抽象策略
 */
@property (nonatomic, strong, readonly) InputValidator  *inputValidator;

/**
 *  初始化textField
 *
 *  @param frame
 *  @param inputValidator 验证策略
 *
 *  @return 实例对象
 */
- (instancetype)initWithFrame:(CGRect)frame withInputValidator:(InputValidator *)inputValidator;

/**
 *  对应于具体策略的返回值
 *
 *  @return 是否合格
 */
- (BOOL)validate;

@end
//
//  CustomField.m
//  StrategyPattern
//
//  Created by YouXianMing on 15/7/26.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "CustomField.h"

@interface CustomField ()

/**
 *  抽象策略
 */
@property (nonatomic, strong) InputValidator  *inputValidator;

@end

@implementation CustomField

#pragma mark - 初始化
- (instancetype)initWithFrame:(CGRect)frame withInputValidator:(InputValidator *)inputValidator {
    
    self = [super initWithFrame:frame];
    if (self) {
    
        [self setup];
        
        // 持有inputValidator
        self.inputValidator = inputValidator;
    }
    
    return self;
}

- (void)setup {

    UIView *leftView       = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, self.frame.size.height)];
    self.leftView          = leftView;
    self.leftViewMode      = UITextFieldViewModeAlways;
    
    self.font = [UIFont fontWithName:@"Avenir-Book" size:12.f];
    
    self.layer.borderWidth = 0.5f;
}

- (BOOL)validate {

    return [self.inputValidator validateInput:self];
}

@end

 

分析

策略模式对比示意图(抽象类与具体实现的详细对比)

策略被封装在对象之中(是对象内容的一部分),策略改变的是对象的内容的

简化了 if - else 操作(按照以前的写法,有几个TextField判断,就得写几个if - else,还有,实现细节暴露出来,维护困难 -_-!!)

 

posted @ 2015-07-26 09:23  YouXianMing  阅读(773)  评论(2编辑  收藏  举报