本篇是四部曲的第三篇,第一篇请点这里iOS设计模式四部曲(一):创建型模式,第二篇请点击这里iOS设计模式四部曲(二):结构型模式。由于个人能力有限,文中难免有一些遗漏或者错误,请各位看官不吝赐教!谢谢!本文所有Demo可以在我的Git上获取,请点击这里

上图是整个设计模式的目录,这篇文章是其中的第三部分:行为型模式。行为型模式包括:责任链模式(Chain of Responsibility)命令模式(Command)中介者模式(Mediator)观察者模式(Observer)备忘录模式(Memento)策略模式(Strategy)访问者模式(Visitor)模板方法模式(TemplateMethod)状态模式(State)迭代器模式(Iterator)解释器模式(Interpreter)。下面我们就开始吧~

责任链模式(Chain of Responsibility):

1.定义: 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之前的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有对象处理它为止。 2. 使用场景: 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时确定。 3. 具体实现: 这里举了一个实际中公司请假批假的例子,具体请点击这里查看 4.优点: 1.低耦合:将请求和处理分开,请求者可以不用知道是谁处理的。2.新增和修改新的处理类比较容易 5.缺点: 每个请求都是从链头遍历到链尾,如果链比较长会产生一定的性能问题,调试起来也比较麻烦。 6.注意事项: 避免超长链的情况出现


命令模式(Command):

1.定义: 命令模式将请求封装成对象,从而可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销和恢复的操作。 2. 使用场景: 在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理的时候。 3. 具体实现: YTKNetwork就是用的命令模式,推荐大家学习。这里我举了一个吃饭点菜的例子,具体请点击这里查看 4.优点: 1.类间解耦:调用者与接收者之间没有任何依赖关系。2.扩展性良好:新的命令可以很容易添加到系统中去。 5.缺点: 使用命令模式可能会导致系统有过多的具体命令类。


中介者模式(Mediator):

1.定义: 中介者模式就是用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 2. 使用场景: 多个类相互依赖,形成了网状结构的时候可以考虑使用中介者模式。 3. 具体实现: 这里举了一个聊天室的例子,具体请点击这里查看 4.优点: 1.解耦:通过中介者模式,我们可以将复杂关系的网状结构变成结构简单的以中介者为核心的星形结构,每个对象不再和它与之关联的对象直接发生相互作用,而是通过中介者对象来另一个对象发生相互作用。2.降低了类的复杂度,将一对多转化成了一对一。 **5.缺点:**中介者模式在某些情况会膨胀得很大,而且逻辑复杂,中介类越多越复杂,越难以维护。 6.注意事项: 类之间的依赖关系是必然存在的,所以不一定有多个依赖关系的时候就考虑使用中介者模式。中介者模式适用于多个对象之间的紧密耦合的情况,紧密耦合的定义标准是:在类图中出现了蜘蛛网状结构,这种情况就要考虑使用中介者模式,中介者模式可以把蜘蛛网梳理成星型结构,使原本复杂混乱的关系变得清晰简单。


观察者模式(Observer):

1.定义: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 2. 使用场景: 一个对象的状态发生改变,所有的依赖对象都将得到通知的时候。 3. 具体实现: Objective-C中的通知以及KVO都是观察者模式的具体实现。这里举了一个找工作订阅的例子,具体请点击这里查看 4.优点: 1.观察者和被观察者是抽象耦合的,扩展比较方便。2.建立一套触发机制。 5.缺点: 1.如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2.如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3.观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。


备忘录模式(Memento):

1.定义: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就开奖对象恢复到原先保存的状态了。 2. 使用场景: 需要存档的时候,比如说游戏中的存档。 3. 具体实现: 打游戏时的存档,数据库的事务管理,SVN以及Git代码的版本控制系统等等都可以说成是备忘录模式的实例。这里我简单的举了一下例子,具体请点击这里查看 4.优点: 1.给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2.实现了信息的封装,使得用户不需要关心状态的保存细节。 5.缺点: 在一些场景下比较消耗资源。 6.注意事项: 不要在频繁建立备份的场景中使用备忘录模式,比如说在for循环中。


策略模式(Strategy):

1.定义: 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。 2. 使用场景: 1.多个类只有在算法或行为上稍有不同的场景。2.算法需要自由切换的场景。3.需要屏蔽算法规则的场景。 3. 具体实现: 具体请点击这里查看 4.优点: 1.算法可以自由切换。 2.避免使用多重条件判断。 3.扩展性良好。 **5.缺点:**1.策略类会增多。 2.所有策略类都需要对外暴露。 6.注意事项: 如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。


访问者模式(Visitor):

1.定义: 访问者模式封装了一些作用于某种数据结构中的各元素操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 2. 使用场景: 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中。 3. 具体实现: 这里举了一个悲观的人和乐观的人对待不同事物的反应的实例,具体请点击这里查看,如果想增加Action就比较方便,但是如果想增加一个既悲观又乐观的人就有一点麻烦了。 4.优点: 1.符合单一职责原则。 2.优秀的扩展性。 3.灵活性高 **5.缺点:**1.具体元素对访问者公布细节,违反了迪米特原则。 2.具体元素变更比较困难。 3.违反了依赖倒置原则,依赖了具体类,没有依赖抽象。


模板方法模式(TemplateMethod):

1.定义: 定义一个操作中的算法的框架,而降一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 2. 使用场景: 1.多个子类有公有的方法,并且逻辑基本相同时。2.有重要、复杂的算法的时候,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。 3. 具体实现: 这里简单举了一个Android 和iOS项目的从code到发布的简易过程Demo,具体请点击这里查看 4.优点: 1.封装不变部分,扩展可变部分。 2.提取公共代码,便于维护。 3.行为由父类控制,子类实现。 5.缺点: 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。


状态模式(State):

1.定义: 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。 2. 使用场景: 1.行为随状态改变而改变的场景。2.条件、分支判断语句的替代者。 3. 具体实现: 这里举了一个不太恰当的例子,假如一支笔有3种状态可以切换,可以写钢笔字,圆珠笔字,毛笔字,具体请点击这里查看。再举一个实际中典型的例子就是酒店管理房间的时候,房间应该会有三种状态:空闲,已预订,已入住,同理。 4.优点: 1.结构清晰,避免了过多的选择判断语句。2.封装性比较好。 5.缺点: 子类会比较多,增加了复杂度。


迭代器模式(Iterator):

1.定义: 迭代器模式提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。 2. 使用场景: 一个聚合对象有遍历的需求 3. 具体实现: 在 Cocoa Touch 中的 NSEnumerator类 就实现了迭代器模式。还有基于块的枚举也是迭代器模式的实现等等 4.优点: 1.它支持以不同的方式遍历一个聚合对象。2.增加新的collection类和迭代器类都很方便。 5.缺点: 迭代器和collection类是对应的,增加新的collection类就会增加新的迭代器,类的个数成对增加,可能会增加系统复杂度。


解释器模式(Interpreter):

1.定义: 给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。 2. 使用场景: 解释器模式在实际项目中用到的比较少,正则表达式就是用的解释器模式。 3. 具体实现: 正则表达式。 4.优点: 容易改变和扩展问法。 5.缺点: 效率是严重的问题。


扩展阅读: iOS 中的 21 种设计模式 https://github.com/kamranahmedse/design-patterns-for-humans


**EOF:**这篇文章通过Demo梳理了设计模式中的行为型模式,由于个人能力有限,难免有一些遗漏或者错误,还请各位看官不吝赐教! 本文已同步到个人博客,**欢迎关注,欢迎点赞,欢迎star,欢迎一起交流,一起进步!**?

iOS设计模式四部曲(三):行为型模式 内附Demo相关推荐

  1. iOS设计模式四部曲(二) 结构型模式 内附Demo

    本篇是四部曲的第二篇,第一篇请点这里iOS设计模式四部曲(一):创建型模式 内附Demo,关于设计模式强烈推荐图书<Head First设计模式>以及<研磨设计模式>.由于个人 ...

  2. iOS开发 - 面向对象设计的设计模式(一):创建型模式(附 Demo UML类图)

    继上一篇的面向对象设计的设计原则,本篇是面向对象设计系列的第二个部分:面向对象设计的设计模式的第一篇文章. 另外,本篇博客的代码和类图都保存在我的GitHub库中:中的Chapter2. 最开始说一下 ...

  3. Java设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  4. iOS 蓝牙4.0开发使用(内附Demo)

    一: 介绍 近几年,智能设备越来越火,这些智能设备中,有很大一部分是通过手机来控制硬件设备,来达到预期的效果,这中间少不了要使用到蓝牙功能,通过蓝牙来通信来控制设备. 蓝牙分为蓝牙2.0和蓝牙4.0. ...

  5. 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...

    转自:http://www.cnblogs.com/stonehat/archive/2012/04/16/2451891.html 设计模式系列--三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂 ...

  6. 【设计模式·Python】创建型模式

    设计模式中,创建型模式主要由以下几种: 工厂方法模式 抽象工厂模式 建造者模式 原型模式 单例模式 简单工厂模式 不直接向客户暴露对象的实现细节,而是通过一个工厂类来负责创建产品的实例. 角色: 工厂 ...

  7. Java设计模式之五大创建型模式

    Java设计模式之五大创建型模式 设计模式(23种) 单例模式(Singleton Pattern) 参考链接 概念 使用场景 实现思路 实现方式 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线 ...

  8. 《深入设计模式》笔记 -创建型模式三、生成器模式(建造者模式)

    生成器模式 亦称:建造者模式.Builder 意图 生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象. 该模式允许你使用相同的创建代码生成不同类型和形式的对象. 问题 假设有这样一个复杂对 ...

  9. 设计模式一:创建型模式

    知识储备: 1.接口:若干抽象方法的集合 作用:限制实现接口的类必须按照接口给定的调用方式实现这些方法:对高层模块隐藏了类的内部实现. 2.面向对象设计SOLID原则 开放封闭原则:一个软件实体如类. ...

最新文章

  1. 366万常用的中 txt 网盘_推荐三款我常用于备份文件的网盘,堪称精品中的精品,建议收藏!...
  2. mysql超时失效c3p0_解决c3p0和MySQL集成情况下,连接长时间闲置后重新使用时报错的问题...
  3. 织梦后台上传文章的php文件是那个,如何在织梦文章中上传视频及调用视频
  4. NURBS曲面结构及生成原理、修改方法
  5. flutter的安装与设置
  6. 界面 高炉系统_首钢京唐七大系统介绍
  7. 从对我的质疑说起,谈谈Linux下的文件删除
  8. 大家都关注的Serverless,阿里怎么做的?
  9. 8考勤填报_公司考勤管理制度
  10. ORACLE SQL功能优化系列(一)
  11. Astalavista被蹂躏过程 转载自baoz net
  12. 台式计算机截图快捷键,台式电脑怎么用快捷键截图
  13. 根据M3U8文件地址下载网站上的视频
  14. 用户体验报告——石墨文档
  15. ssh远程连接发送命令行
  16. 诺顿等效电路 用计算机,r t norton equivalent circuits (诺顿等效电路).ppt
  17. 线上问题:stream获取值抛出空指针及源码分析
  18. kindle版java核心_深入理解java 7 核心技术与最佳实践-成富[6寸pdf mobi epub kindle版].pdf...
  19. ubuntu 迅雷(xware desktop)
  20. 【无2021年煤矿采煤机(掘进机)操作考试技巧及煤矿采煤机(掘进机)操作模拟考试题

热门文章

  1. 当析构函数遇到多线程──C++ 中线程安全的对象回调
  2. python中的list和array的区别及相互转化
  3. 基于Springboot实现企业人事管理系统
  4. python中Scipy模块求取积分
  5. CF643E Bear and Destroying Subtrees
  6. React Native知识
  7. Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)
  8. 根据当前时间判断上午好、下午好
  9. [jobdu]调整数组顺序使奇数位于偶数前面
  10. Tiobe 发布2011年2月开发语言排名,C#和Python在2011年继续上升