模板方法模式定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。模板方法模式是由子类决定实现算法中的步骤,工厂方法由子类决定实现哪一个具体的类,策略模式是封装可以互换的行为,使用委托决定采用哪一个行为,有的时候这三种容易出现理解上的偏差。

基础知识

模板方法的UML类图:

关于模板方法我们思考一个生活中的例子,我们都会网购,天猫或者京东,经历一下四个步骤,①访问网站②浏览下单③支付④收货,两种网站第二步和最后一步都是一样的,访问和支付的访问不一样,两个网站网址不一样,支付方式不一样~稍微思考一下可以怎么实现~

实战探讨

关于上面的需要设计三个类,网购类,天猫类,京东类:

OnLineShop:

@protocol OnLineShopProtocol

@optional
-(void)accessURL;
@optional
-(void)pay; @end @interface OnLineShop : NSObject<OnLineShopProtocol> -(void)shop; -(Boolean)callMyMobileHook; @end
@interface OnLineShop()

-(void)createOrder;

-(void)receiptGoods;

@end

@implementation OnLineShop

-(void)shop{
[self accessURL];
[self createOrder];
[self pay];
if ([self callMyMobileHook]) {
[self receiptGoods];
}
} -(void)createOrder{
NSLog(@"创建订单成功");
} -(void)receiptGoods{
NSLog(@"收到了物品");
}
//子类可以回调钩子
-(Boolean)callMyMobileHook{
return true;
} @end

Tmall类继承自OnLineShop:

@implementation Tmall

-(void)accessURL{
NSLog(@"https://www.taobao.com/");
} -(void)pay{
NSLog(@"支付宝");
} -(Boolean)callMyMobileHook{
return true;
} @end

JDong类:

@implementation JDong

-(void)accessURL{
NSLog(@"http://www.jd.com/");
} -(void)pay{
NSLog(@"货到付款");
} -(Boolean)callMyMobileHook{
NSLog(@"博客园-FlyElephant");
return false;
} @end

代码测试:

    OnLineShop  *tmall=[[Tmall alloc]init];
[tmall shop];
OnLineShop *jd=[[JDong alloc]init];
[jd shop];

测试结果:

模板方法优点:

①模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。

②子类实现算法的某些细节,有助于算法的扩展。通过一个父类调用子类实现的操作,

③通过子类扩展增加新的行为,符合“开放-封闭原则”。

缺点

①每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

适用于在某些类的算法中,用了相同的方法,造成代码的重复。 控制子类扩展,子类必须遵守算法规则。

模板方式中涉及到一个原则是好莱坞原则,别调用我们,我们会调用你~理解起来就是高层组件可以调用底层组件,底层组件不要调用高层组件~

iOS开发-模板方法模式的更多相关文章

  1. iOS开发-代理模式

    代理模式有的时候也被称之为委托模式,但是实际上两者是有分别的,代理模式为另一个对象提供一个替身或占位符访问这个对象,代理对象和控制访问对象属于同一类,委托对象和对象不一定属于同一类.两者都可以控制类的 ...

  2. iOS开发-命令模式

    命令模式算是设计模式中比较简单的,最常见的例子是工作任务安排下来进行编程,如果工作任务不需要完成,我们可以取消我们之前完成的代码,也可以理解为回滚撤销操作.这里面涉及到命令模式中的两个对象,一个是动作 ...

  3. iOS开发-工厂模式

    工厂模式算是开发中比较常见的设计模式,简单工厂模式,工厂模式和抽象工厂模式,都属于工厂模式.简单工厂模式(simple factory)是类的创建模式,静态工厂方法(static factory me ...

  4. iOS开发-状态模式

    状态模式允许对象内部状态改变时改变它的行为,对象看起来好像修改了它的类.状态模式看起来和策略模式比较相像,策略模式是将可以互换的行为封装起来,然后通过使用委托的方式,决定使用哪一个行为,状态也是封装行 ...

  5. iOS开发-迭代器模式

    迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示.开发过程中,我们可能需要针对不同的需求,可能需要以不同的方式来遍历整个整合对象,但是我们不希望 ...

  6. iOS开发——工厂模式

    工厂模式很好用,为表诚意,我直接搞个实用的例子放这,解析一个订单的数据,并且这个订单里面可能不止一件商品的做法. 还是直接上代码,不懂的地方,再提出来. 1.在MyOrderDeals.h文件中 #i ...

  7. iOS开发-策略模式

    策略(Strategy)模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.策略模式是对算法的包装,是把使用算法的责任和算法本身分割开 ...

  8. iOS开发——swift精讲&MVC应用实战

    MVC应用实战 iOS开发中设计模式是很重要的,其中,使用最多的就是MVC模式,今天就简单介绍一下在Swift中这么使用MVC模式来实现我们想要的功能: 模型-视图-控制器(Model-View-Co ...

  9. 通知模式实现两个textField传值及模态视图——iOS开发

    通知模式实现两个textField传值及模态视图--iOS开发 利用通知模式,实现两个不同界面的textField之间的传值,在界面二输入字符,传值到前一界面的textField. 界面的切换,这里临 ...

随机推荐

  1. oracle <> 选不出为null的部分

    比如 tablea 的 字段b 为空,则 select * from tablea where b <> 'Y' 则查不出b is null 的部分

  2. 《Java程序性能优化》之程序优化

    这一部分主要介绍代码层的优化.了解如何编写高效而精炼的代码,正确的使用函数方法.1.字符串优化处理Java语言中,String对象可以认为是对char数组的眼神和进一步封装.它主要由3部分组成:cha ...

  3. day8--socketserver作业

    fileno()文件描述符 handle_request()处理单个请求 server_forever(poll_interval=0.5)处理多个请求,poll_interval每0.5秒检测是否关 ...

  4. python全栈开发day37-html

    web准备总结: 结构标准:相当于人的身体.html就是用来制作网页的. 表现标准: 相当于人的衣服.css就是对网页进行美化的. 行为标准: 相当于人的动作.JS就是让网页动起来,具有生命力的 1. ...

  5. asp.net core 内置DI容器的一点小理解

    DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IOC). 具体体现为Micorosoft.Extensio ...

  6. Docker dockerfile镜像编码

    一. 大多数docker基础镜像使用locale查看编码,发现默认编码都是POSIX,这会导致中文乱码.解决方法如下: 二.首先使用locale -a查看容器所有语言环境 三.dockerfile中加 ...

  7. ubuntu16.04下vim的安装与配置

    一.安装vim 使用命令 $ sudo apt-get install vim  来安装vim,安装后的vim需要进行一些配置,不然使用起来会有些不方便,比如不会自动缩进. 二.配置vim 使用命令  ...

  8. 关于make: *** No rule to make target `clean'. Stop.这个莫名其妙问题的解决方法

    执行make编译命令总报错,后来试试make clean命令也不行,报下面的错. make: *** No rule to make target `clean'.  Stop. 真是莫名其妙的错误, ...

  9. UVA - 11149 (矩阵快速幂+倍增法)

    第一道矩阵快速幂的题:模板题: #include<stack> #include<queue> #include<cmath> #include<cstdio ...

  10. Android超链接

    第一种: text += "<a href='http://www.baidu.com'>百度超链接</a>"; CharSequence charSequ ...