java命令模式应用_Java设计模式系列之命令模式

命令模式(Command)的定义

将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作,将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来。

命令模式(Command)的适用性

1.抽象出待执行的动作以参数化某对象。

2.在不同的时刻指定、排列和执行请求。

3.支持取消操作。

4.支持修改日志,这样当系统崩溃时,这样修改可以被重做一遍。

5.用构建在原语操作上的高层操作构造一个系统。

命令模式(Command)的应用效果:

1)command模式将调用操作的对象和实现该操作的对象解耦

2)可以将多个命令装配成一个复合命令,复合命令是Composite模式的一个实例

3)增加新的command很容易,无需改变已有的类

命令模式(Command)的参与者

1.Command

声明执行操作的接口。

2.ConcreteCommand

将一个接收者对象绑定于一个动作。

调用接收者相应的操作,以实现Execute。

3.Client

创建一个具体命令对象并设定它的接收者。

4.Invoker

要求该命令执行这个请求。

5.Receiver

知道如何实现与执行一个请求相关的操作。任何类都可能作为一个接收者。

命令模式(Command)的UML类图

e2bc1fc25dec5667b3edc28e225ec8b9.png

具体的代码实现:

第一步:定义Command,声明执行操作的接口

//命令接口

public interface Command {

//执行操作

public void excute();

//撤销操作

public void unDo();

}

第二步:定义ConcreteCommand,将一个接收者对象绑定于一个动作。

public class ConcreteCommand implements Command {

// 持有一个接受者Receiver的引用,绑定一个特定的操作

Receiver receiver;

public ConcreteCommand(Receiver receiver) {

this.receiver = receiver;

}

@Override

public void excute() {

// 接受者绑定执行动作

receiver.action();

}

@Override

public void unDo() {

// 接受者绑定的撤销动作

receiver.unAction();

}

}

第三步:定义Receiver,知道如何实现与执行一个请求相关的操作

public class Receiver {

public void action() {

System.out.println("执行一个命令");

}

public void unAction() {

System.out.println("撤销一个命令");

}

}

第四步:定义Invoker,要求该命令执行这个请求。

public class Invoker {

// 调用者持有一个命令对象

Command command;

public Command getCommand() {

return command;

}

public void setCommand(Command command) {

this.command = command;

}

// 执行命令

public void excuteCommmand() {

command.excute();

}

// 撤销命令

public void undoCommand() {

command.unDo();

}

}

第五步:定义Clien,我们来测试一下我们的命令模式

public class Client {

/**

* @param args

*/

public static void main(String[] args) {

// 创建命令的接受者

Receiver receiver = new Receiver();

// 创建命令对象,并设定它的接受者

Command command = new ConcreteCommand(receiver);

// 创建命令执行者,并将相应的命令作为参数传递给Invoker

Invoker invoker = new Invoker();

invoker.setCommand(command);

// Client端测试一下

invoker.excuteCommmand();

invoker.undoCommand();

}

}

运行结果:

执行一个命令

撤销一个命令

总结:

1、在被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接收者和一个或一组动作;

2、调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用;

3、调用者可以接受命令当作参数,甚至在运行时动态的进行;

4、命令可以支持撤销,做法是实现一个undo()方法来回到execute()被执行前的状态;

5、命令模式将发出请求的对象和执行请求的对象进行解耦;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值