设计模式面试题, 什么是命令模式?一般用在什么场景?
设计模式面试题, 什么是命令模式?一般用在什么场景?
QA
Step 1
Q:: 什么是命令模式?
A:: 命令模式(Command Pattern)是一种行为设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。命令模式的核心在于将方法调用、请求或操作封装到单独的命令对象中。这样可以使得系统支持可插拔的操作和操作的撤销、重做。
Step 2
Q:: 命令模式的一般结构是怎样的?
A:: 命令模式主要包含以下几个部分:
1.
命令接口(Command):定义执行命令的接口,通常包括一个execute
方法。
2.
具体命令类(ConcreteCommand):实现命令接口,具体执行某个操作。
3.
调用者(Invoker):持有命令对象并在需要时调用命令的执行方法。
4.
接收者(Receiver):实际执行命令的逻辑的对象。
5.
客户端(Client):负责创建具体的命令对象,并指定接收者。
Step 3
Q:: 命令模式通常用在哪些场景?
A:: 命令模式常用于以下场景:
1.
需要撤销操作的场景:例如文本编辑器中的撤销和重做功能。
2.
需要参数化执行请求:例如按钮点击触发不同的操作,可以将操作封装为命令对象,使按钮可以执行不同的命令。
3.
需要记录日志以便稍后重放命令:例如系统恢复或日志审计等功能。
4.
任务队列的处理:任务可以以命令的形式存入队列,依次执行。
Step 4
Q:: 命令模式的优缺点有哪些?
A:: 优点:
1.
解耦请求发送者与执行者:通过引入中间命令对象,避免了发送者和接收者之间的直接耦合。
2.
支持可撤销操作:可以很容易实现命令的撤销和重做功能。
3.
扩展性好:增加新的命令很方便,符合开闭原则。
缺点:
1.
增加代码复杂度:引入大量的命令类可能会使代码结构更加复杂,难以理解和维护。
2.
命令类可能变得冗长:每个具体的操作都需要定义一个命令类,这在某些场景下可能会显得过于冗长。
Step 5
Q:: 如何实现命令模式的撤销功能?
A:: 实现命令模式的撤销功能通常需要在命令类中增加一个unexecute
方法,该方法用于撤销之前的execute
操作。为了实现这一点,命令对象通常需要保存执行前的状态,以便在撤销时能够恢复。举例来说,文本编辑器中的撤销功能可能会保存每次文本修改前的状态,以便在撤销时恢复到之前的文本内容。