将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
命令模式的构成
1 客户角色:创建一个具体命令对象,并确定其接收者
2 命令角色:声明一个给所有具体命令类的抽象接口。这是一个抽象角色,通常由一个接口或抽象类实现
3 具体命令角色:定义一个接收者和行为之间的弱耦合,实现execute方法,负责调用接收者的相应操作
4 请求者角色:负责调用命令对象执行请求。
5 接收者角色:负责具体实施和执行一个请求
UML类图:
package com.designpattern;
public class CommandPatternDemo {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Invoker Invoker = new Invoker();
CommandA commandA = new CommandA(receiver);
Invoker.setCommand(commandA);
Invoker.execute();
CommandB CommandB = new CommandB(receiver);
Invoker.setCommand(CommandB);
Invoker.execute();
// 有两种请求要发送过来执行
// 一种请求就是读请求, 一种请求就是写请求,不同请求要执行的功能逻辑不一样的
// 此时就非常适合命令模式
// 将读请求封装到readCommand里面去,将写请求封装到writeCommand里面去
// 然后设置一个通用的命令类来执行即可
}
public static class Receiver {
public void read(){
System.out.println(" read ......");
}
public void write(){
System.out.println(" write ......");
}
}
public interface Command {
public void execute();
}
public static class CommandA implements Command {
private Receiver Receiver;
public CommandA(CommandPatternDemo.Receiver receiver) {
Receiver = receiver;
}
public void execute() {
System.out.println("命令A的功能逻辑");
Receiver.read();
}
}
public static class CommandB implements Command {
private Receiver Receiver;
public CommandB(CommandPatternDemo.Receiver receiver) {
Receiver = receiver;
}
public void execute() {
System.out.println("命令B的功能逻辑");
Receiver.write();
}
}
public static class Invoker {
private Command Command;
public CommandPatternDemo.Command getCommand() {
return Command;
}
public void setCommand(CommandPatternDemo.Command command) {
Command = command;
}
public void execute() {
Command.execute();
}
}
}
命令模式的适用场景
对于大多数请求-响应模式的功能,比较适合使用命令模式,正如命令模式定义说的那样,命令模式对实现记录日志、撤销操作等功能比较方便。