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(, , , 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设计模式 - 策略的更多相关文章
- iOS书摘之Objective-C编程之道 iOS设计模式解析
来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...
- iOS设计模式 - (1)概述
近期可自由安排的时间比較多, iOS应用方面, 没什么好点子, 就先放下, 不写了.花点时间学学设计模式. 之后将会写一系列博文, 记录设计模式学习过程. 当然, 由于我自己是搞iOS的, 所以之后设 ...
- 15. 星际争霸之php设计模式--策略模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- IOS设计模式之一(MVC模式,单例模式)
iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...
- iOS 设计模式之工厂模式
iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...
- iOS设计模式之生成器
iOS设计模式之生成器 1.生成器模式的定义 (1): 将一个复杂的对象的构件与它的表示分离,使得相同的构建过程能够创建不同的表示 (2): 生成器模式除了客户之外还包括一个Director(指导者) ...
- IOS设计模式之三:MVC模式
IOS设计模式之三:MVC模式 模型-视图-控制器 这个模式其实应该叫做MCV,用控制器把model与view隔开才对,也就是model与view互相不知道对方的存在,没有任何瓜葛,他们就像一个团 ...
- [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)
[.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ...
- linkin大话设计模式--策略模式
linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi] 策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...
随机推荐
- c++ 网络编程(十一) LINUX下 初步制作基于HTTP的WEB服务器
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9663028.html HTTP概要 理解Web服务器端: 编写HTTP(超文本传输协议)服务器 ...
- 深度学习(八) Batch Normalization
一:BN的解释: 定义: 顾名思义,batch normalization嘛,就是“批规范化”咯.Google在ICML文中描述的非常清晰,即在每次SGD时,通过mini-batch来对相应的act ...
- C 标准库 - string.h之memmove使用
memmove Move block of memory Copies the values of num bytes from the location pointed by source to t ...
- js动画实现(一)
requestAnimationFrame是什么? 在浏览器动画程序中,我们通常使用一个定时器来循环每隔几毫秒移动目标物体一次,来让它动起来.如今有一个好消息,浏览器开发商们决定:“嗨,为什么我们不在 ...
- MySQL在创建数据表的时候创建索引
转载:http://www.baike369.com/content/?id=5478 MySQL在创建数据表的时候创建索引 在MySQL中创建表的时候,可以直接创建索引.基本的语法格式如下: CRE ...
- Java jxl导入excel文件,导入的数字、身份证号码、手机号变成了科学计数法,解决方案
原文出自:https://blog.csdn.net/seesun2012 这是一个execl文件导入数据库操作,使用jxl解析execl导入数据库过程出现了科学计数法,与想要导入的数据不匹配,以下是 ...
- Winform截图小程序
今天闲时做的一个Demo,做得并不好,只是实现了最基本的截图功能 主要的思路就是 先打开一个主窗体,点击"截图按钮" 会出现一个半透明的小窗体(可以拉伸放大缩小) 然后利用Grap ...
- 最新的dubbo和zookeeper整合的问题
最新的dubbo和zookeeper整合的问题 生活本不易,流人遂自安 博主最新在做小项目练手,在进行dubbo和zookeeper整合的时候遇到了一些问题,在这里这些问题做个小总结吧. 首先需要说明 ...
- 撩课-Java每天10道面试题第5天
41.Iterator.ListIterator 和 Enumeration的区别? 迭代器是一种设计模式, 它是一个对象, 它可以遍历并选择序列中的对象, 而开发人员不需要了解 该序列的底层结构. ...
- java map常用的4种遍历方法
public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...