iOS 设计模式-策略模式
1.策略模式简介
??策略模式(Strategy Pattern),是行为型模式之一(设计模式分类:https://www.songma.com/p/18fee11deac9)。
??在软件开发中常常遇到这样的情况:实现某一个功能可以有多种算法或者者策略,我们根据实际情况选择不同的算法或者者策略来完成该功能。例如,排序算法,可以使用插入排序、归并排序、冒泡排序等。
??针对这种情况,一种常规的方法是将多种算法写在一个类中。例如,需要提供多种排序算法,可以将这些算法写到一个类中,每一个方法对应一个具体的排序算法;当然,也可以将这些排序算法封装在一个统一的方法中,通过if…else… 或者者case等条件判断语句来选择具体的算法。这两种实现方法我们都可以称为硬编码。然而,当很多个算法集中在一个类中,这个类就会变得臃肿,这个类的维护成本会变高,在维护时也更容易引发错误。假如我们添加一种新的排序算法,需要修改封装算法类的源代码。这就显著违背了我们所说的OCP(开闭)准则和单一职责准则。(OCP:软件中的对象(类、板块、函数等)应该对于扩展是开放的,但是对于修改是封闭的。)
??假如将这些算法或者者策略笼统出来,提供一个统一的接口,不同的算法或者者策略有不同的实现类(类一定是变多了),这样在程序用户端即可以通过注入不同的实现对象来实现算法或者者策略的动态替换,这种模式的可扩展性、可维护性也就更高,也就是我们所说的策略模式。-《Android源码设计模式解析与实战》
2策略模式定义
??策略模式定义了一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的用户而独立变化。-《Android源码设计模式解析与实战》
??面向对象软件设计中,我们可以把相关算法分离为不同的类,成为策略。与这种做法有关的一种设计模式称为策略模式。
3.策略模式的使用场景
3.1 针对同一类型问题的多种解决方式,仅仅只是具体行为有差别时。
3.2需要安全地封装多种同一类型的操作时。
3.3出现统一笼统类有多个子类,而又需要使用if-else 或者者 switch-case 来选择具体子类时。
4.策略模式的UML图
策略模式UML.png
5.策略模式 角色划分
角色一:Context 用于操作策略的上下文环境 场景类的对象配置有一个具体策略对象的实例,场景对象使用策略接口调用有具体策略类定义的算法。
角色二:Stragety 笼统策略
角色三:ConcreteStragety 具体策略
6.Demo 实践
??假设应用程序中需要用UITextField以接受客户的输入,而后要在应用程序的解决中使用这个输入值。应用程序有个文字输入框,只接受字母,即a-z或者A-Z,还有个输入框只接受数值型的值,即0~9。为了保证每个字段的输入有效,需要在客户结束文本框的编辑时做些验证。
??这个时候我们可以把数据验证放大UITextField的委托方法textFieldDidEndEditing:之中。UITextfield的实例每当失去焦点时会调用这个方法。假如不用策略模式,代码通常会写成下面的样子:
- (void)textFieldDidEndEditing:(UITextField *)textField{ if (textField == letterTextField) { //验证能否是字母 } else if (textField == numberTextField){ //验证能否是数字 } else if ...}
??要是有更多不同类型的文本框,条件语句还会继续下去,代码越来越臃肿,难以维护。假如能去掉这些条件语句,代码会更易管理,将来对代码的维护也会容易得多。(假如代码中有很多条件语句,即可能意味着需要把它们重构成各种策略模式)
??所以现在的目标是把这些验证检查提到各种策略类中,这样它们就能在委托或者者其余方法中重用。每个验证都从文本框取出输入值,而后根据所需的策略进行验证,最后返回个BOOL值; 假如验证失败,还会返回一个NSError实例。返回的NSError可以解释失败的起因。
Demo的UML图如下:
策略模式DemoUML.png
这里不把接口公告为协议,而是公告为笼统基类。笼统基类更适合处理这种问题,由于它更容易重构各种具体策略子类的某些共同行为。
使用策略模式后用户端代码的样子:
- (void)textFieldDidEndEditing:(UITextField *)textField{ if ([textField isKindOfClass:[CustomTextField class]]) { [(CustomTextField*)textField validate]; }}
重要的事情说三遍,肯定要看Demo,肯定要看Demo,肯定要看Demo。
Demo地址: zhiyoukaifa/StrategyPatternDemo
参考书籍:
《Objective-C编程之道 iOS设计模式解析》
《Android源码设计模式解析与实战》
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » iOS 设计模式-策略模式