命令模式:
命令模式是对命令的封装。它将发出的命令的责任和执行的命令分隔开,委派给不同的对象。被委派的对象虽然具有执行的命令,但只有在接收到命令后,才会执行命令。
下面是命令模式的结构图:
命令模式涉及五个角色:
- 客户类(Client):创建一个具体的命令对象,确认其接收者。
- 抽象命令类(Command):声明一个给所有具体命令类的抽象接口。这是一个抽象角色,可以是接口或抽象类。
- 具体命令类(ConcreteCommand):定义一个接受者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。
- 请求者类(Invoke):负责对调用命令对象执行请求,相关的方法叫做行动方法
- 接收者类(Receiver):负责具体实施和执行请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
PS:值得注意的是:接收者类,具有接收到命令会执行的动作,但它只有在接收到命令时才会执行
源代码分析:
接收者类(Receiver)
Receiver.java:
public class Receiver {
public Receiver(){
System.out.println("命令接收者:");
} public void action(){
System.out.println("接收到命令后,执行的动作");
}
}
抽象命令类(Command)
Command.java:
public interface Command { public void excute(); }
具体命令类(ConcreteCommand)
ConcreteCommand.java:
public class ConcreteCommand implements Command{ Receiver receiver; public ConcreteCommand(Receiver receiver){
this.receiver = receiver;
}
//实现调用接收者类执行动作的方法
@Override
public void excute() {
receiver.action();
}
}
发送请求类(Invoker)
Invoker.java
public class Invoker {
private Command command; public Invoker(Command command){
this.command = command;
}
//发送命令
public void action(){
command.excute();
}
}
客户端:
public class Client {
public static void main(String[] args){
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(command);
invoker.action();
}
}
运行结果:
命令接收者:
接收到命令后,执行的动作