设计模式与动态语言之命令模式 Command

命令模式是对象行为型使用率比较高的设计模式,别名:Action(动作),Transaction(事务)

[b]意图: 将一个请求封装为一个对象,从而使你可对不同的请求进行参数化;对请求排队或记录请求日志,以及支持可取消的操作 [/b]
这里所谓的“不同的请求”也既意味着请求可能发生的变化,是一个可能扩展的功能点。

动机: 方便扩展

结构:


[img]http://dl.iteye.com/upload/attachment/177849/5a29fa8f-fb37-3825-9399-fb12a5a85fb8.png[/img]


协作说明:
参与角色:
 Command 声明一个接口以用来实现某个操作。
ConcreteCommand 将动作与Reciver对外绑定,通过调用Reciver对象的相应方法来实现Command的方法。
Client 创建ConcreteCommand对象,并设置其Reciver对象。
  Invoker 要求该Command实现请求。
  Reciver 知道如何实现具体的请求的类。
  客户端创建了一个具体的Command对象并指定了其接收者。
  调用者对象存储了此具体的Command对象。
  调用者对象通过执行Command对象的Execute方法来实现当前请求。
  如果命令是可以撤销时,具体对象在调用执行方法前将存储相应的状态以用来命令此请求。
  具体的Command对象调用其接收者的方法从而来实现相应请求。


适用性:
[list]
[*]类似于 MenuItem , 抽象出待执行的动作以参数化某对象
[*]在不同的时刻指定,排列,执行请求
[*]支持撤消
[*]支持修改日志
[*]在构建在原语操作上的高层操作构造一个系统(其实就是事务)
[/list]

动态性方面: 像ruby中 block 就是命令模式

效果:
[list]
[*]命令模式将调用者对象与接收对象解耦(调用与实现解耦)。调用者实现功能时只需调用Command接口的Execute方法。
[*]具体的Commands对象是第一层对象,它们可以像其他对象一样被扩展或操作。
[*]你可以将多个Commands对象聚合成一个组合命令。组合命令也是组合对象模式的一个实例,将命令排队也是其的一种特殊情况。
[*]你可以很容易的添加新的命令,因为你并不需要修改现有的代码。这也符合了开闭原则,对修改关闭,对扩展开放。
[/list]

实现时应考虑命令对象应达到何种智能程序和支持撤消和重做这两个问题.


误用:
[list]
[*]不要着迷 到底哪个简单?
[*]命令模式不是说“做这个” 说“ 记住这个如何做”,稍后再说”按照我刚才要你记住的方法做这个”
[*]小心撤销,许多操作是破坏性的,如删除文件操作
[/list]

这里特别讲下观察者模式和命令模式的区别,
观察者模式没有顺序性,它的顺序不可把握,而命令模式是有顺序的,具备队列性质,并可撤销.

下面是个小例子,模拟短消息定服务:


class SmsService
attr_accessor :service_list

def initialize
@service_list = []
end

def add_message(service)
@service_list << service
end

def do
@service_list.each do |sl|
sl.exec
end
end
end

class ServiceSystem
def do
puts '执行成功'
end
end

class Service
attr_accessor :service_system

def initialize(s)
@service_system = s
end
end

class ApplyShowNumberService < Service
def exec
puts '正在申请电显示服务'
service_system.do
end
end

class CancelShowNumberService < Service
def exec
puts '正在取消来电显示服务'
service_system.do
end
end

ss = SmsService.new
ss.add_message(ApplyShowNumberService.new(ServiceSystem.new))
ss.add_message(CancelShowNumberService.new(ServiceSystem.new))
ss.do



类图:

[img]http://dl.iteye.com/upload/attachment/177857/6cec2e2c-73d7-35ea-822a-57557392b163.jpg[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深入探索了类、接口、属性和方法。讲解了数据结构,演示了如何用ado.net来解决具体的数据访问问题。重点讨论了ado.net如何有效地平衡"功能的泛化"和"执行效率",以及它如何解决对扩展性、并发性和可靠性的要求。针对其他数据访问api(包括ole db,ado,odbc和jdbc)的程序员,提供了帮助其迁移到ado.net许多易用的参考 本书由资深数据库教师编写,全面介绍了ado.net。书中深入剖析了ado.net的本质,探索了类、接口、属性和方法的工作原理,同时还为其他数据访问api(包括oledb,ado,odbc和jdbc)的程序员,提供了有价值的参考材料。本书适合具有一定数据库基础的开发人员阅读,也可用作数据库中高级课程或培训班配套教材。 第1章 数据:模型、应用程序和api 1.1 信息、数据建模和数据库 1.2 数据库和api基础 1.3 关系模型 1.3.1 关系设计规则 1.3.2 关系模型的优点 1.3.3 ado.net对关系模型的支持 1.4 层次结构、对象和混合 1.4.1 现代的非关系数据 1.4.2 多维数据 1.4.3 非关系数据和ado.net 1.4.4 xml和信息集 1.4.5 xml、数据库和统一数据表示 1.5 以数据的中心的应用程序模型 1.6 数据访问api的发展历程 1.7 小结 第2章 ado.net基础 2.1 数据访问和.net体系结构 2.2 两种数据访问模式 .2.3 连接模式 2.3.1 oledb和sqlclient数据提供程序 2.3.2 使用ado.net数据提供程序编写泛型数据访问代码 2.3.3 数据提供程序模型中的游标 2.4 断开模式和dataset 2.5 .net中的xml api 2.5.1 流式xml 2.5.2 xml架构 2.5.3 xmldocument,xpath和xpathnavigator 2.5.4 xml和数据提供程序的混合 2.6 托管数据类的布局 2.7 小结 第3章 连接模型:流式数据访问 3.1 .net数据提供程序和连接模型 3.2 连接类 3.3 连接池 3.4 元数据方法 3.5 command类 3.6 使用参数 3.7 命令的准备、取消、超时和清除 3.8 通过datareader进行流式数据传输 3.9 通过idatarecord读取列值 3.10 错误处理 3.11 使用事务处理 3.11.1 分布式事务处理 3.11.2 连接池的工作原理 3.11.3 声明性事务处理的工作原理 3.12 permission类 3.13 小结 第4章 dataset类:关系数据的集合 4.1 dataset 4.1.1 dataset作为驻留内存的数据库 4.1.2 dataset的用途 4.2 dataset对象模型 4.2.1 datacolumn,datarow和data table 4.2.2 data table及其用法 4.2.3 datarow 4.2.4 键、关系和约束 4.2.5 通过关系来导航:select和find 4.2.6 行的添加、获取、更改和删除 4.2.7 合并更改 4.2.8 合并dataset 4.2.9 datarow的状态和版本 4.2.10 规则和关系 4.2.11 错误处理 4.2.12 事件 4.2.13 dataset和非关系类型 4.3 定义信息架构 4.4 小结 第5章 dataadapter:数据库和dataset的同步 5.1 乐观并发性 5.2 dataadapter类 5.3 从托管提供程序中填充dataset 5.3.1 在fill中使用架构和映射信息 5.3.2 执行dataadapter.fill期间的错误处理 5.4 dataadapter.fill的工作原理 5.5 oledbdataadapter中的ado集成 5.6 通过dataadapter更新数据库 5.6.1 commandbuilder类 5.6.2 直接编写更新逻辑 5.7 update的工作原理 5.8 dataset事件模型 5.9 编写常规自定义命令 5.9.1 adox commandbuilder 5.9.2 构造批处理更新命令 5.10 再论dataset和非关系数据类型 5.11 应该使用dataset还是datareader 5.12 小结 第6章 数据绑定:ado.net和gui 6.1 windows窗体和web窗体 6.2 数据表示模式 6.3 使用数据绑定控件 6.3.1 web窗体数据绑定类型 6.3.2 数据绑定控件类型解析 6.3.3 同datareader绑定 6.4 用dataset进行数据绑定 6.5 data view和通用转换 6.6 表和列映射 6.7 可编辑的列表控件:datalist和datagrid 6.7.1 datalist 6.7.2 datagrid 6.8 非关系数据和data view 6.9 与visual studio的集成 6.10 控件和数据窗体 6.1l 小结 第7章 xml和数据访问的集成 7.1 xml和传统数据访问 7.2 xml和ado.net 7.2.1 定义dataset的架构 7.2.2 优化dataset的xml架构 7.2.3 将xml读入dataset 7.2.4 从dataset写入xml架构 7.2.5 microsoft特有的批注 7.2.6 从dataset写入xml数据 7.3 序列化、封送和dataset 7.4 类型化的dataset 7.5 xmldatadocument类 7.5.1 xmldatadocument和dataset 7.5.2 xmldatadocument和datadocumentxpathnavigator 7.6 数据库和xml的重要意义 7.6.1 xml作为一种特定类型 7.6.2 文档合成与分解 7.7 sql server、xml和托管数据访问 7.7.1 for xml关键字 7.7.2 openxml 7.7.3 sqloledb提供程序 7.7.4 sqlxml托管类 7.7.5 sqlxml web应用程序 7.7.6 updategram 7.7.7 sql xml oledb提供程序中的for xml 7.7.8 批量加载 7.7.9 未来的支持 7.8 使用sqlxml和.net 7.9 小结 第8章 提供程序:ado.net和数据提供程序 8.1 如何选择 8.2 保留ole db:ole db概念总结 8.3 保留ole db:与oledb数据提供程序交互 8.3.1 主要的共型和类型映射 8.3.2 访问程序 8.3.3 执行命令、返回结果和使用openrowset 8.3.4 command的最终格式和行为 8.3.5 command dialect 8.3.6 层次化数据 8.3.7 从rowset更新 8.3.8 错误 8.3.9 不支持的功能 8.3.10 支持和不支持的提供程序 8.4 编写数据提供程序 8.5 实现connection类 8.5.1 规格 8.5.2 实现 8.5.3 特殊化 8.6 实现command类 8.6.1 规格 8.6.2 实现 8.6.3 特殊化 8.7 实现datareader类 8.7.1 规格 8.7.2 实现 8.7.3 特殊化 8.8 实现dataadapter类 8.8.1 规格 8.8.2 实现 8.8.3 特殊化 8.9 添加增强功能 8.10 实现xml infoset提供程序 8.11 实现xmlreader 8.12 实现xpathnavigator 8.13 其他实现方案:总结 8.14 论证大一统访问模型的可行性 8.15 小结 第9章 消费者的ado.net迁移路径 9.1 ado.net迁移路径 9.2 面向ole db程序员的ado.net 9.2.1 cotype等价物 9.2.2 数据提供程序的透明性 9.2.3 使用提供程序特有的功能 9.2.4 错误处理 9.2.5 系统提供的服务 9.2.6 系统提供的组件 9.2.7 服务提供程序 9.2.8 封送 9.3 ado概述 9.4 面向ado程序员的ado.net 9.5 ado connection、command和事务处理 9.5.1 连接和连接字符串 9.5.2 使用事务处理 9.5.3 命令command行为 9.5.4 层次化数据 9.5.5 异步操作 9.5.6 属性 9.6 ado.net与ado断开模型的比较 9.6.1 类的等价物 9.6.2 导航 9.6.3 ado.net中的getrows有何变化 9.6.4 更新 9.6.5 创建更新语句 9.6.6 批处理更新 9.6.7 ado.net的dataset扩展 9.6.8 列和表的命名 9.6.9 排序和筛选 9.7 ado db的互操作性 9.8 面向odbc程序员的ado.net 9.8.1 句柄和环境 9.8.2 命令 9.8.3 获取数据 9.8.4 元数据和架构信息 9.8.5 错误 9.9 面向jdbc程序员的ado.net 9.9.1 泛化代码 9.9.2 提供程序的类型 9.9.3 连接池 9.9.4 非关系数据类型 9.9.5 对象数据库 9.9.6 其他sql-99扩展 9.9.7 元数据 9.9.8 事务处理 9.9.9 命令和行为 9.9.10 执行查询和返回结果 9.9.11 服务器游标 9.9.12 错误 9.10 ado.net jdbc程序员和断开模型 9.11 sql/j part 0和类型化dataset 9.12 小结 第10章 ado.net和各种数据类型 10.1 数据访问的发展历程 10.2 ado.net和基于服务器及文件的rdbms 10.3 ado.net和同种层次结构数据及ordbms 10.4 ado.net和网络数据:对象图、odbms与网络dbms 10.5 ado.net和结构化文件、多维数据及ordbms 10.6 ado.net平面文件和半结构化文件 10.7 小结 附录a 数据类型和类型映射 a.1 db type枚举 a.2 将sql server数据类型映射到sqltype及sqldbtype a.3 将ole db dbtype映射到.net数据类型 a.4 odbc类型映射 a.5 parameter.dbtype 附录b 表达式的语法 b.1 用户自定义值 b.2 运算符 b.3 字符串运算符 b.4 通配符 b.5 父/子关系引用 b.6 聚合 b.7 函数 附录c 架构推断规则 c.1 排除信息 c.2 推断过程总结 c.3 表 c.4 有属性的元素 c.5 有子元素的元素 c.6 重复元素 c.7 列 c.8 属性 c.9 没有属性或子元素的元素 c.10 关系 c.11 元素文本 c.12 限制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值