1. 概述
命令模式:客户端对服务器端发出各种命令。
2. Command设计模式类关系
2.1 模式结构
命令模式包含如下角色:
-
Command: 抽象命令类
-
ConcreteCommand: 具体命令类
-
Invoker: 调用者
-
Receiver: 接收者
-
Client:客户类
2.2 模式分析
-
命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
-
每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。
-
命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
-
命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。
-
命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。
3. 定义
-
将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
-
优点: 解耦了调用者和接受者之间联系。调用者调用一个操作,接受者接受请求执行相应的动作,因为使用Command模式解耦,调用者无需知道接受者任何接口。
-
缺点: 造成出现过多的具体命令类
4. Command设计模式示例
- 播放器执行命令者
package command;
//命令执行者播放器
public class Player {
public void turnOn(){
System.out.println("打开");
}
public void turnOff(){
System.out.println("关闭");
}
public void next(){
System.out.println("下一曲");
}
}
- 命令接口
package command;
public interface Command {
public void execute();
}
- 各种命令实现类
package command;
//打开命令类
public class TurnOnCommand implements Command {
private Player player;
public TurnOnCommand(Player player) {
this.player = player;
}
public void execute() {
this.player.turnOn();
}
}
package command;
//关闭命令类
public class TurnOffCommand implements Command {
private Player player;
public TurnOffCommand(Player player) {
this.player = player;
}
public void execute() {
this.player.turnOff();
}
}
package command;
//下一曲命令类
public class NextCommand implements Command {
private Player player;
public NextCommand(Player player) {
this.player = player;
}
public void execute() {
this.player.next();
}
}
- 命令发送者类
package command;
//命令发送类
public class PlayerInvoker {
private TurnOnCommand on;
private TurnOffCommand off;
private NextCommand next;
public PlayerInvoker(TurnOnCommand on,TurnOffCommand off,NextCommand next) {
this.on = on;
this.off = off;
this.next = next;
}
public void turnOn(){
this.on.execute();
}
public void turnOff(){
this.off.execute();
}
public void next(){
this.next.execute();
}
}
- 测试类
package command;
//测试类
public class Text {
public static void main(String[] args) {
Player player = new Player();
TurnOnCommand on = new TurnOnCommand(player);
TurnOffCommand off = new TurnOffCommand(player);
NextCommand next = new NextCommand(player);
PlayerInvoker invoker = new PlayerInvoker(on, off, next);
invoker.turnOn();
invoker.turnOff();
invoker.next();
}
}