这里谈谈策略和模板方法模式,之所以把这两个模式放在一起,是因为从结构上来讲他们很像。

先来说策略模式,它实现起来很其实简单,它和模板方法在结构上的主要差异在于抽象对象采用抽象类还是协议。

这个抽象对象当中的方法相当于java/C#里的virtual方法,甚至如果有需要可以弄成abstract方法。

但是OC当中并没有这两个概念,其实这样设计是有好处的,由于这种不严格性,就没有必要考虑接口变动时的版本兼容性问题。

下面来模仿一个抽象类。

以一个正则校验逻辑为例子:

抽象策略:

1 #import <Foundation/Foundation.h>
2
3 @interface ValidateStrategy : NSObject
4 -(BOOL)validate:(NSString *)str;
5 @end

1 #import "ValidateStrategy.h"
2
3 @implementation ValidateStrategy
4 -(BOOL)validate:(NSString *)str {
5     return NO;
6 }
7 @end

具体策略之一:

1 #import <UIKit/UIKit.h>
2 #import "ValidateStrategy.h"
3 @interface NumberValidateStrategy : ValidateStrategy
4 -(BOOL)validate:(NSString *)str;
5 @end

1 @implementation NumberValidateStrategy
2 -(BOOL)validate:(NSString *)str{
3     NSError *regError = nil;
4     NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^\\d+$" options:NSRegularExpressionAnchorsMatchLines error:&regError];
5     NSUInteger numberOfMatches = [regex numberOfMatchesInString:str options:NSMatchingAnchored range:NSMakeRange(0, [str length])];
6     return (regError == nil && numberOfMatches != 0);
7 }
8 @end

调用端:

1 - (IBAction)checkNumberBtn:(UIButton *)sender {
2     ValidateStrategy *strategy = [[NumberValidateStrategy alloc]init];
3
4     BOOL validateResult = [strategy validate:[self.inputText text]];
5     NSLog(@"%d", validateResult);
6 }

整体思路和在java/C#当中是一样的,具体的策略类的获取也通过依赖注入的方式获得,这里不再赘述。

接下来说模板方法模式,它的结构和和策略模式很类似,我觉得没必要用太多的代码来描述它。

差别只是在抽象类当中定义了一个调用入口,其中包含对方法调用的骨架,然后由子类来重写这些方法。

唯一一个需要解决的问题是,如何保证一个子类”必须“重载这个方法。

在java/C#当中,骨架方法通常是虚方法,如果必须重载,则是抽象方法,在上面已经提到了,OC可以达到虚方法的效果,

但是OC没有抽象方法机制,所以可以在父类的方法当中抛异常来达到同样的目的:

1 -(void)mustOverrideMethod {
2     [NSException raise:NSInternalInconsistencyException format:@"您必须重载该方法"];
3 }

转载于:https://www.cnblogs.com/Steak/p/3538832.html

模仿虚基类和抽象方法相关推荐

  1. 【选择恐惧症】接口?虚基类?

    [选择恐惧症]接口?虚基类? 症前兆 症分析 症解答 症总结 症前兆 记得有个朋友跟我讨论过这样的一个问题,说到他刚刚学习接口和虚基类的相关知识时觉得很迷茫,不知道什么时候该用接口,什么时候该使用虚基 ...

  2. 多继承中虚基类构造函数的一种调用规则

    规则:如果父类中有虚基类(A),且有一个直接基类(B)是虚基类的子类,那么子类(C或D)若不显式调用虚基类的有参数构造函数,它的直接基类(B)即使在构造列表中调用了非默认构造函数,那么也会直接调用虚基 ...

  3. C++中的虚继承与虚基类

    1.Cpp中的虚继承与虚基类 在多继承时,很容易产生命名冲突的问题,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示: 类A派 ...

  4. 虚继承c语言例子,C/C++ 多继承{虚基类,虚继承,构造顺序,析构顺序}

    C/C++:一个基类继承和多个基类继承的区别 1.对多个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性, ...

  5. [YTU]_2622(B 虚拟继承(虚基类)-沙发床(改错题))

    题目描述 有一种特殊的床,既能当床(Bed)用又能当沙发(Sofa)用,所以叫沙发床(SleeperSofa). 同时床和沙发又是一种特殊的家具(Furniture),具有一切家具的特性. 利用虚拟继 ...

  6. [YTU]_2566( 虚基类练习:动物)

    题目描述 长期的物种进化使两栖动物既能活跃在陆地上,又能游动于水中.利用虚基类建立一个类的多重继承,包括动物(animal,属性有体长,体重和性别),陆生动物(ter_animal,属性增加了奔跑速度 ...

  7. C++虚继承和虚基类详解(二)

    虚继承(Virtual Inheritance) 为了解决多继承时的命名冲突和冗余数据问题,C++ 提出了虚继承,使得在派生类中只保留一份间接基类的成员. 在继承方式前面加上 virtual 关键字就 ...

  8. 详解虚函数的实现过程之虚基类(4)

    博客虚函数实现过程3 时提到过虚基类,这里呢,我们来详细讲述一下: 当我们在虚函数的声明结尾处添加"=0",这种虚函数就被称为纯虚函数. 它好似一个没有实现只有声明的函数,它的存在 ...

  9. 虚基类(c++细节篇七)

    虚基 采用虚基类的方法,可使派生类在继承间接共同基类时只保留一份成员,既减少了存储空间,也消除了成员访问的二义性. 定义格式: class 派生类名:virtual 继承方式 基类名 { 派生类新增成 ...

最新文章

  1. MyBatis-Plus为啥这么牛?
  2. 数字化如何影响药物开发
  3. Jedis使用教程完整版
  4. spark读取hdfs路径下的数据_到底什么是数据湖
  5. python通讯录管理程序的用户可行性_通讯录管理系统项目可行性分析
  6. 可以获得索引值码_SEO优化细节,怎样优化才能让网站获得更好的排名?
  7. 有一门课不及格的学生(信息学奥赛一本通-T1048)
  8. 在实践中总结出的几条 CodeReview 实用经验
  9. C++ 基类和派生类的virtual虚析构函数
  10. [转载] python 一个简单的天气预报程序
  11. Qt 学习之路 2(84):Repeater
  12. 如何进行音频合并?很简单,只需三步骤
  13. 顶岗实习周记java方向_java程序员的实习周记
  14. 如何写出公众号爆文?分享你一份爆文写作秘籍
  15. 精选VSCode插件
  16. 阿里程序员常用的 15 款开发者工具
  17. 处理jmeter tcp 取样器500错误
  18. 【MySQL】MyCat分库分表分片规则配置详解与实战(MySQL专栏启动)
  19. L2-040 哲哲打游戏(Python3)
  20. MongoError: Cannot use a session that has ended ---- NodeJs报错

热门文章

  1. PHP安全、Sql防注入安全汇总
  2. 传感器追踪身体健康数据 可穿戴式将帮助人体实时监测外界伤害
  3. 【PMP】知识点总结20170528
  4. 《深入理解Spark:核心思想与源码分析》——第1章环境准备
  5. atitit.复合变量,也就是类似$$a的变量的原理与实现 java c#.net php js
  6. 简明Python3教程 10.模块
  7. 测试数值计算程序要注意的问题
  8. 转-完成端口高效的三个原因
  9. IBM首席执行官提出人工智能部署三大基本原则
  10. 【Java实现】栈和队列就是这么简单