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(, , , self.frame.size.height)];
self.leftView = leftView;
self.leftViewMode = UITextFieldViewModeAlways; self.font = [UIFont fontWithName:@"Avenir-Book" size:.f]; self.layer.borderWidth = 0.5f;
} - (BOOL)validate { return [self.inputValidator validateInput:self];
} @end

分析

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

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

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

iOS设计模式 - 策略的更多相关文章

  1. iOS书摘之Objective-C编程之道 iOS设计模式解析

    来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...

  2. iOS设计模式 - (1)概述

    近期可自由安排的时间比較多, iOS应用方面, 没什么好点子, 就先放下, 不写了.花点时间学学设计模式. 之后将会写一系列博文, 记录设计模式学习过程. 当然, 由于我自己是搞iOS的, 所以之后设 ...

  3. 15. 星际争霸之php设计模式--策略模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. IOS设计模式之一(MVC模式,单例模式)

    iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...

  5. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  6. iOS设计模式之生成器

    iOS设计模式之生成器 1.生成器模式的定义 (1): 将一个复杂的对象的构件与它的表示分离,使得相同的构建过程能够创建不同的表示 (2): 生成器模式除了客户之外还包括一个Director(指导者) ...

  7. IOS设计模式之三:MVC模式

    IOS设计模式之三:MVC模式   模型-视图-控制器 这个模式其实应该叫做MCV,用控制器把model与view隔开才对,也就是model与view互相不知道对方的存在,没有任何瓜葛,他们就像一个团 ...

  8. [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)

    [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ...

  9. linkin大话设计模式--策略模式

    linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi]  策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...

随机推荐

  1. javascript 遍历

    数组的遍历你都会用了,那Promise版本的呢 这里指的遍历方法包括:map.reduce.reduceRight.forEach.filter.some.every因为最近要进行了一些数据汇总,no ...

  2. 《Think Python》第5章学习笔记

    目录 5.1 整除和取模(Floor division and modulus) 5.2 布尔表达式(Boolean expressions) 5.3 逻辑运算符(Logical operators) ...

  3. jquery 选择唯一值 选择器“”非“用法

    $(document).ready(function () { $("#addwork").hide(); $(".xi").click(function(){ ...

  4. web弹出对话框

    Page.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('请输入 ...

  5. apache Header set Cache-Control

    设置静态页面的缓存最大值 在.htaccess中添加下面的代码 <FilesMatch "\.(flv|gif|jpg|jpeg|png|ico|swf)$"> Hea ...

  6. HDU2048 神,上帝以及老天爷 错排

    http://acm.hdu.edu.cn/showproblem.php?pid=2048 这是一道错排的题目 错排如下:http://baike.baidu.com/link?url=U2_H-4 ...

  7. MySQL之多表查询练习

    一.表格 表一  emp 表二 dept 表三 salgrade; 表四 年度利润表 二.习题 1. 查出至少有一个员工的部门.显示部门编号.部门名称.部门位置.部门人数. 2. 列出所有员工的姓名及 ...

  8. 线性规划费用流解法(Bzoj1061: [Noi2008]志愿者招募)

    题面 传送门 Sol 线性规划费用流解法用与求解未知数为非负数的问题 这道题可以列出一堆形如 \(x[i]+x[j]+x[k]+...>=a[p]\) 的不等式 我们强行给每个式子减去一个东西, ...

  9. MyEclipse打包带源码的jar包

    平时开发中,我们喜欢将一些类打包成jar包,然后在别的项目中继续使用,不过由于看不到jar包里面的类的源码了,所以也就无法调试,要想调试,那么就只能通过关联源代码的形式,这样或多或少也有一些不方便,今 ...

  10. Django请求生命周期之响应内容

    Django请求生命周期: 1.发送http请求2.服务器接受,根据请求头中的url在路由关系表中进行匹配(从上到下)3.匹配成功后,执行指定的views函数 URL -> 函数 ==>F ...