命令模式是对象行为型使用率比较高的设计模式,别名:Action(动作),Transaction(事务)
意图: 将一个请求封装为一个对象,从而使你可对不同的请求进行参数化;对请求排队或记录请求日志,以及支持可取消的操作
这里所谓的“不同的请求”也既意味着请求可能发生的变化,是一个可能扩展的功能点。
动机: 方便扩展
结构:
协作说明:
参与角色:
Command 声明一个接口以用来实现某个操作。
ConcreteCommand 将动作与Reciver对外绑定,通过调用Reciver对象的相应方法来实现Command的方法。
Client 创建ConcreteCommand对象,并设置其Reciver对象。
Invoker 要求该Command实现请求。
Reciver 知道如何实现具体的请求的类。
客户端创建了一个具体的Command对象并指定了其接收者。
调用者对象存储了此具体的Command对象。
调用者对象通过执行Command对象的Execute方法来实现当前请求。
如果命令是可以撤销时,具体对象在调用执行方法前将存储相应的状态以用来命令此请求。
具体的Command对象调用其接收者的方法从而来实现相应请求。
适用性:
- 类似于 MenuItem , 抽象出待执行的动作以参数化某对象
- 在不同的时刻指定,排列,执行请求
- 支持撤消
- 支持修改日志
- 在构建在原语操作上的高层操作构造一个系统(其实就是事务)
动态性方面: 像ruby中 block 就是命令模式
效果:
- 命令模式将调用者对象与接收对象解耦(调用与实现解耦)。调用者实现功能时只需调用Command接口的Execute方法。
- 具体的Commands对象是第一层对象,它们可以像其他对象一样被扩展或操作。
- 你可以将多个Commands对象聚合成一个组合命令。组合命令也是组合对象模式的一个实例,将命令排队也是其的一种特殊情况。
- 你可以很容易的添加新的命令,因为你并不需要修改现有的代码。这也符合了开闭原则,对修改关闭,对扩展开放。
实现时应考虑命令对象应达到何种智能程序和支持撤消和重做这两个问题.
误用:
- 不要着迷 到底哪个简单?
- 命令模式不是说“做这个” 说“ 记住这个如何做”,稍后再说”按照我刚才要你记住的方法做这个”
- 小心撤销,许多操作是破坏性的,如删除文件操作
这里特别讲下观察者模式和命令模式的区别,
观察者模式没有顺序性,它的顺序不可把握,而命令模式是有顺序的,具备队列性质,并可撤销.
下面是个小例子,模拟短消息定服务:
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
类图:
- 大小: 9.7 KB
- 大小: 27 KB
分享到:
相关推荐
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于解耦发出命令的对象和执行命令的...
Command设计模式是一种行为设计模式,它将请求封装为一个对象,使得你可以参数化不同请求,对请求排队或者记录请求日志,以及支持可撤销的操作。在.NET开发中,C#语言是实现这种模式的理想选择,因为它提供了丰富的...
在这个“设计模式作业——用命令模式java语言编写的烧烤店”项目中,我们将探讨如何运用命令模式来构建一个模拟烧烤店的系统。命令模式是一种行为设计模式,它将请求封装为一个对象,使得我们可以参数化不同的请求、...
如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录模式(Memento)、状态模式(State)、职责链...
在Java中,设计模式的应用不仅限于上述介绍,还包括其他如命令模式(Command)、迭代器模式(Iterator)、备忘录模式(Memento)、模板方法模式(Template Method)等。这些模式在设计复杂系统时起着关键作用,比如...
设计模式之美在于它们是软件设计的通用语言,无论你使用哪种编程语言,都能通过这些模式与他人进行有效的沟通。通过深入学习和实践,我们可以不断提升自己的设计能力,写出更加优雅、高效和可复用的代码。记住,设计...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本专题中,我们将深入探讨命令模式,并通过Python和C++两种...
JavaScript设计模式是指在软件开发中使用JavaScript语言编写的设计模式。这些设计模式旨在提高代码的重用性、可读性、维护性和扩展性。以下是JavaScript设计模式的知识点总结: 1. 单体模式(Singleton Pattern)...
目 录 序言 前言 读者指南 第1章 引言 1 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244
3. 行为型模式(Behavioral Patterns):这类模式主要处理对象之间的责任分配,包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式...
包括策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、备忘录模式(Memento)、状态模式(State)、访问者模式(Visitor)、责任链...
4. **命令模式与其他设计模式的结合**:如组合模式、策略模式等,它们可以一起使用以解决更复杂的设计问题。 课件可能还会讲解如何使用Java或其他编程语言实现命令模式,包括类的定义、对象的创建和交互过程。通过...
关注对象之间的责任分配和通信,包括策略模式(Strategy)、模板方法模式(Template Method)、迭代器模式(Iterator)、观察者模式(Observer)、访问者模式(Visitor)、命令模式(Command)、备忘录模式(Memento...
在软件开发中,特别是面向对象编程语言中,命令模式是一种常用的设计模式,它通过将操作请求转化为一个包含与请求相关的所有信息的对象,从而允许参数化这些操作。这样做的好处是可以轻松地添加新的操作类型,同时...
- 命令模式(Command):将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。 - 解释器模式(Interpreter):给定一种语言,定义它的文法的一种表示,并且提供一个解释器。 - 迭代器模式(Iterator...
#### 一、C语言与设计模式 在计算机科学领域,设计模式是指在软件设计过程中解决常见问题的一套被广泛接受的解决方案。虽然设计模式最初是在面向对象编程语言中被广泛应用的,但也可以应用于像C这样的过程化语言。 ...
3. 行为型模式:这类模式主要关注对象间的行为和交互,包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式...
9. **命令(Command)模式**:命令模式将请求封装为一个对象,使得可以使用不同的请求、队列请求、记录请求日志、支持可撤销的操作等。它在事件驱动系统和远程调用中尤为常见。 10. **建造者(Builder)模式**:...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在IT行业中,命令模式的应用非常广泛,尤其在处理事件驱动和异步...