zoukankan      html  css  js  c++  java
  • 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,还有,实现细节暴露出来,维护困难 -_-!!)

  • 相关阅读:
    Deployment progressDeadlineSeconds
    go字符串转[]bytes
    shell单引号内嵌套单引号即可使用变量
    ensp 模拟 calico 跨网段 bgp 网络
    如何利用termination GracePeriodSeconds 优雅地关闭你的服务
    gin是怎么传参数
    垃圾代码评析——关于《C程序设计伴侣》9.4——链表(三)
    垃圾“程序是怎样练成的”——关于《C程序设计伴侣》第A章(五)
    垃圾代码评析——关于《C程序设计伴侣》9.4——链表(四)
    垃圾“程序是怎样炼成的”——关于《C程序设计伴侣》第A章(二)
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4677129.html
Copyright © 2011-2022 走看看