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的类中,客户端程序可以自由的选择任何一种 ...
随机推荐
- Springsecurity搭建自定义登录页面
1.springSecurity的搭建 新建一个springboot的web项目,我这边只选中了web,建立后如下: pom依赖: <!-- https://mvnrepository.com/ ...
- ubuntu工具安装
smplayer sudo add-apt-repository ppa:rvm/smplayer sudo apt-get update sudo apt-get install smplayer ...
- python2和python3中列表推导式的变量泄露问题
Python 2.x 中,在列表推导中 for 关键词之后的赋值操作可能会影响列表推导上下文中的同名变量.像下面这个 Python 2.7 控制台对话: Python 2.7.15 (default, ...
- Windows7 x64 了解堆
一.前言 堆对于开发者一般来说是熟悉又陌生的,熟悉是因为我们常常使用new/delete或者malloc/free使用堆,陌生是因为我们基本没有去了解堆的结构.堆在什么地方?怎么申请?怎么释放?系统又 ...
- ASP.NET MVC Web API 学习笔记---联系人增删改查
本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查. 目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的. 下面我们通过创建一个简单的Web API来管理 ...
- developer.android.google.cn
Android Studio官方 Android IDE https://developer.android.google.cn/studio/index.html 探索 Android Studio ...
- 【Java】短信信息提取设计
问题产生:当有要求做信息有效性校验的时候,如何提取短信中有用的信息? 举个例子:有这样一条短信消息: [XXXXXX提醒]尊敬的客户,截止03月21日15:29,您本月套餐中包含手机上网国内流量累计1 ...
- JDBC入门(4)--- 批处理
1.Statement批处理 当你有10条SQL语句要执行时,一次向服务器发送一条SQL语句,这样做的效率上极差,处理的方案是使用批处理,即一次向服务发送多条SQL语句,然后由服务器一次性处理. 批处 ...
- 关于iFrame特性总计和iFrame跨域解决办法
1.iframe 定义和用法 iframe 元素会创建包含另外一个文档的内联框架(即行内框架). HTML 与 XHTML 之间的差异 在 HTML 4.1 Strict DTD 和 XHTML 1. ...
- csharp: datatable get Column datatype or Column Name
/// <summary> ///列表名 /// </summary> /// <param name="table"></param&g ...