iOS设计模式 - 命令模式
前言:
| 命令对象封装了如何对目标执行指令的信息,因此客户端或调用者不必了解目标的任何细节,却仍可以对他执行任何已有的操作。通过把请求封装成对象,客 户端可 以把它参数化并置入队列或日志中,也能够支持可撤销操作。命令对象将一个或多个动作绑定到特定的接收器。命令模式消除了作为对象的动作和执行它的接收器之 间的绑定。 |
正文内容大纲:
1、电视机、遥控器与接收器之间的关系
2、改变一个视图的明暗程度(未使用命令模式)
3、命令模式介绍
4、改变一个视图的明暗程度(使用命令模式)
5、附录
1.电视机、遥控器与接收器之间的关系
电视机没有遥控器当然也能够换台
如果要用遥控器,电视机上面肯定要有红外线接收器,专门用来接受遥控器的信息。
红外线接收器专门接受遥控器的信息,并转化成电视机里面的信息,让电视机识别。
- 遥控器与接收器并非必要的设备
- 接收器转换遥控器的信号
- 电视机、遥控器与接收器之间的关系:电视机可以独立,不用遥控器和红外线接收器

2.改变一个视图的明暗程度的小实例项目(未使用命令模式)
首先在ViewController添加三个按钮,并设置好相关属性和监听点击事件:

然后创建任务执行者对象Receiver类,创建的实例对象负责执行调整View背景明亮暗度


因为在非命令模式下,撤销逻辑不好实现,这里就不提供实现了

最后展示效果:

其实到这里,Receive对象相当于ViewController的代理,代理完成控制属于Viewcontroller管理和控制的View 的背景明亮暗度调整。只不过这个代理不是那么抽象而且也不是遵循了某个协议的。是具体而直接完成逻辑业务的。这个简单的模式,在项目或者不考虑拓展性或者 某个模块功能固定了,可以使用这个模式。
但是有的业务需求会需要记录存储和取出执行任务的或者信息传递命令的状态,像这里如果要添加撤销操作,就需要记录之前的操作,然后根据之前的操作回 退反过来操作,这时候,命令模式就能比较方便的实现这个逻辑了。命令模式其实就是将发送的命令信息抽象成一个类,然后具体信息就创建具体的类,并通过回调 者添加并执行命令对象的执行命令涉及到的任务方法,同时存储记录这个命令,那么这时候因为每次操作都能存储下来,所以再来设计撤销操作就很容易了。这就是 命令模式的一个优点。
3.命令模式介绍
命令模式的UML图:

概述
在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,
这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间
的松耦合。这就是命令模式(Command Pattern)。
4.改变一个视图的明暗程度(使用命令模式)
分析之前的代码:

为了能够行为进行“记录、撤销/重做、事务”等处理,我们可以使用命令模式:
- 设定接受者
- 将改变明暗的操作抽象成对象
- 撤销操作
分析:





最后命令的发起者和命令的执行者是解耦的。
提供更完整的代码链接: http://pan.baidu.com/s/1sjOlm8l 密码: me5f
5、附录
IOS命令模式的学习网站:http://www.cnblogs.com/YouXianMing/p/4888402.html






iOS设计模式 - 命令模式的更多相关文章
- iOS设计模式 - 命令
iOS设计模式 - 命令 原理图 说明 命令对象封装了如何对目标执行指令的信息,因此客户端或调用者不必了解目标的任何细节,却仍可以对他执行任何已有的操作.通过把请求封装成对象,客户端可以把它参数化并置 ...
- linkin大话设计模式--命令模式
linkin大话设计模式--命令模式 首先考虑一种应用情况,某个方法需要完成某一个功能,这个功能的大部分功能已经确定了,但是有可能少量的步骤没法确定,必须等到执行这个方法才可以确定. 也就是说,我们写 ...
- 【设计模式】Java设计模式 - 命令模式
Java设计模式 - 命令模式 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目录 Ja ...
- [Head First设计模式]餐馆中的设计模式——命令模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- JAVA 设计模式 命令模式
用途 命令模式 (Command) 将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化:对请求排队或请求日志,以及支持可撤销的操作. 命令模式是一种行为型模式. 结构
- 深入浅出设计模式——命令模式(Command Pattern)
模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请 ...
- Java设计模式-命令模式(Command)
命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不用去依赖其 ...
- 设计模式--命令模式(Command)
基本概念: Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数,命令模式将方法调用给封装起来了. 命令模式的 ...
- javascript设计模式——命令模式
前面的话 假设有一个快餐店,而我是该餐厅的点餐服务员,那么我一天的工作应该是这样的:当某位客人点餐或者打来订餐电话后,我会把他的需求都写在清单上,然后交给厨房,客人不用关心是哪些厨师帮他炒菜.餐厅还可 ...
随机推荐
- ruby -- 问题解决(二)rails4.0create引起的ActiveModel::ForbiddenAttributesError错误
之前将rails升级到4.0版本,发生了ActiveModel::ForbiddenAttributesError错误 于是上网溜达了一会,找到解决方案, ActiveModel::Forbidden ...
- 队列的图文解析 和 对应3种语言的实现(C/C++/Java)
概要 本章和介绍"栈"时的流程一样,先对队列进行介绍,然后分别给出队列的C.C++和Java三种语言的实现.内容包括:1. 队列的介绍2. 队列的C实现3. 队列的C++实现4. ...
- 二项堆(一)之 图文解析 和 C语言的实现
概要 本章介绍二项堆,它和之前所讲的堆(二叉堆.左倾堆.斜堆)一样,也是用于实现优先队列的.和以往一样,本文会先对二项堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...
- [Node.js] Cluster,把多核用起来
原文地址: http://www.moye.me/?p=496 引子 众所周知,虽然Node的底层有一个IO线程池,但其应用层默认是单线程运行的,对于多核CPU环境来说,是一种资源的浪费. 所幸Nod ...
- Java魔法堂:注解用法详解——@SuppressWarnings
一.前言 编码时我们总会发现如下变量未被使用的警告提示: 上述代码编译通过且可以运行,但每行前面的“感叹号”就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @SuppressWar ...
- LVS使用整理(1)
开始安装LVS 1)下载相关软件包 mkdir -p /home/tools/cd /home/tools/wget http://www.linuxvirtualserver.org/softwar ...
- mysql创建每月执行一次的event
DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ EVENT `dev_sp2p6`.`e_test1` ON SCHEDULEE ...
- 11.22 点餐APP第一阶段总结
第一个冲刺结束了,任务也算是完成了. 团队合作不像单独做那样想怎么来就怎么来,各个人都不同的意见,最后方案的需要每个人一致同意通过才能执行. 不过团队合作分配到每个人的任务也相对轻一点,而且遇到问题解 ...
- 推荐使用C++ 11
如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++ 11.当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢? 在我看来,答案毫无疑问是肯定的.我在下面给出了9个理由,它们分为 ...
- [CLR via C#]10. 属性
一.无参属性 对于字段,强烈建议将所有的字段都设为private.如果允许用户或类型获取或设置状态信息,就公开一个针对该用途的方法.封装了字段访问的方法通常称为访问器(accessor)方法.访问器方 ...