轻松实现记录与撤销——C#中的Command模式

Command模式属于行为模式,作为大名鼎鼎的23个设计模式之一,Command模式理解起来不如工厂模式,单例模式等那么简单直白。究其原因,行为模式着重于使用,如果没有编程实践,确实不如创造模式那么直白。我们先看看UML类图。
在这里插入图片描述
估计很多同学看着图就晕了,那么多东西,Command和Concrete Command还好理解,那些Receiver和Invoker又是什么东西呢?
 
别着急,只要理解了一点,这个模式就很容易理解了,下面划重点,Command模式最主要的特点,是将命令封装成类,在类中保存命令执行的上下文(即该命令执行的参数,执行的对象),以实现命令执行对象和命令发出对象的解耦
 
这样一来是不是觉得好理解多了?Command类里面的Receiver,就是命令具体执行的对象。这里的Client可以理解为装配环境,在这里面代码实例化Command。Invoker内部保存命令(可以保存多条命令,实现命令记录查看,撤销等),客户端代码通过Invoker来操作命令。接下来我们看看示例代码。

定义Command接口

首先我们定义一个支持撤销的Command接口。

	interface Command
    {
   
        void Execute();
        void Undo();
    }
定义Receiver

接下来我们定义Receiver,也就是命令的执行对象,这里我们定义一个Ball类。

	class Ball
    {
   
        public int Size {
    get; set; } = 10;
        public string Name {
    get; set; } = "My First Ball";
        public void 
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以使用命令模式实现指令的撤销和恢复。命令模式是一种行为设计模式,它将请求封装成一个对象,从而使得可以使用不同的请求来参数化其他对象。这种模式允许将请求排队或者记录请求日志,以及支持可撤销的操作。 在实现指令的撤销和恢复时,可以定义一个Command接口,其定义了execute()和undo()两个方法。execute()方法执行指令,而undo()方法用于撤销指令。具体的指令可以通过实现Command接口来实现。 为了支持多次撤销和恢复操作,可以使用一个栈来保存执行的指令,当需要撤销时,将栈顶的指令弹出并执行undo()方法即可。当需要恢复时,将栈顶的指令弹出并执行execute()方法即可。 以下是一个简单的示例代码: ``` public interface Command { void execute(); void undo(); } public class CommandImpl implements Command { private Receiver receiver; private String arg; public CommandImpl(Receiver receiver, String arg) { this.receiver = receiver; this.arg = arg; } @Override public void execute() { receiver.action(arg); } @Override public void undo() { receiver.undo(); } } public class Receiver { private String state; public void action(String arg) { state = arg; System.out.println("执行指令,设置状态为:" + state); } public void undo() { System.out.println("撤销指令,状态恢复为:" + state); } } public class Invoker { private Stack<Command> undoStack = new Stack<>(); private Stack<Command> redoStack = new Stack<>(); public void execute(Command command) { command.execute(); undoStack.push(command); redoStack.clear(); } public void undo() { if (!undoStack.isEmpty()) { Command command = undoStack.pop(); command.undo(); redoStack.push(command); } } public void redo() { if (!redoStack.isEmpty()) { Command command = redoStack.pop(); command.execute(); undoStack.push(command); } } } public class Client { public static void main(String[] args) { Invoker invoker = new Invoker(); Receiver receiver = new Receiver(); Command command1 = new CommandImpl(receiver, "state1"); invoker.execute(command1); Command command2 = new CommandImpl(receiver, "state2"); invoker.execute(command2); invoker.undo(); invoker.redo(); } } ``` 在上述示例代码CommandImpl类实现Command接口,Receiver类是命令的接收者,Invoker类用于执行和撤销命令,Client类是测试类。当执行main()方法时,会输出以下内容: ``` 执行指令,设置状态为:state1 执行指令,设置状态为:state2 撤销指令,状态恢复为:state1 执行指令,设置状态为:state2 ``` 可以看到指令的撤销和恢复操作都成功地实现了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值