定义:
- 命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。
- 命令模式把请求封装起来,可以动态地对它进行参数化、队列化和日志化等操作,从而使得系统更灵活。
- 命令模式中的命令对象能够很容易地组合成复合命令,也就是宏命令,从而使系统操作更简单,功能更强大。
- 由于发起命令的对象和具体的实现完全解耦,因此扩展新的命令就很容易,只需要实现新的命令对象,然后在装配的时候,把具体的实现对象设置到命令对象中,然后就可以使用这个命令对象,已有的实现完全不用变化。
代码
- 盒式录音机,此录音机有播音(Play)、倒带(Rewind)和停止(Stop)功能
- 录音机的键盘便是请求者(Invoker)角色;用户(Julia)是客户端角色,而录音机便是接收者角色。Command类扮演抽象命令角色,而PlayCommand、StopCommand和RewindCommand便是具体命令类。用户(Julia)不需要知道播音(play)、倒带(rewind)和停止(stop)功能是怎么具体执行的,这些命令执行的细节全都由键盘(Keypad)具体实施。 用户只需要在键盘上按下相应的键便可以了。
package com.example.demo;
public class test11 {
public static void main(String[] args) {
// 接受者对象
AudioPlayer audioPlayer =new AudioPlayer();
//创建命令对象
Command command1= new PlayCommand(audioPlayer);
Command command2= new RewindCommand(audioPlayer);
Command command3= new StopCommand(audioPlayer);
//创建请求者对象
Keypad keypad = new Keypad();
keypad.setPlayCommand(command1);
keypad.setRewindCommand(command2);
keypad.setStopCommand(command3);
//测试一下
keypad.play();
keypad.rewind();
keypad.stop();
keypad.play();
keypad.rewind();
/* 播放...
倒带...
停止...
播放...
倒带...*/
}
}
//接收者角色,由录音机类扮演
class AudioPlayer {
void play() {
System.out.println("播放...");
}
void rewind() {
System.out.println("倒带...");
}
void stop() {
System.out.println("停止...");
}
}
// 抽象命令角色类
interface Command {
void execute();
}
//具体命令角色类
//播放方法
class PlayCommand implements Command {
private AudioPlayer audioPlayer;
public PlayCommand(AudioPlayer audioPlayer) {
this.audioPlayer = audioPlayer;
}
@Override
public void execute() {
audioPlayer.play();
}
}
//倒带
class RewindCommand implements Command {
private AudioPlayer audioPlayer;
public RewindCommand(AudioPlayer audioPlayer) {
this.audioPlayer = audioPlayer;
}
@Override
public void execute() {
audioPlayer.rewind();
}
}
//停止
class StopCommand implements Command {
private AudioPlayer audioPlayer;
public StopCommand(AudioPlayer audioPlayer) {
this.audioPlayer = audioPlayer;
}
@Override
public void execute() {
audioPlayer.stop();
}
}
// 请求者角色,由键盘类扮演
class Keypad {
private Command playCommand;
private Command rewindCommand;
private Command stopCommand;
public Command getPlayCommand() {
return playCommand;
}
public void setPlayCommand(Command playCommand) {
this.playCommand = playCommand;
}
public Command getRewindCommand() {
return rewindCommand;
}
public void setRewindCommand(Command rewindCommand) {
this.rewindCommand = rewindCommand;
}
public Command getStopCommand() {
return stopCommand;
}
public void setStopCommand(Command stopCommand) {
this.stopCommand = stopCommand;
}
/**
* 执行播放
*/
void play(){
playCommand.execute();
}
/** 执行倒带
*/
void rewind(){
rewindCommand.execute();
}
/** 执行停止
*/
void stop(){
stopCommand.execute();
}
}
宏命令
- 所谓宏命令简单点说就是包含多个命令的命令,是一个命令的组合。
- 录音机有一个记录功能,可以把一个一个的命令记录下来,这就是所谓的宏命令集功能。
public static void main(String[] args) {
MacroCommand macroCommand =new MacroAudioCommand();
// 接受者对象
AudioPlayer audioPlayer = new AudioPlayer();
//创建命令对象
Command command1 = new PlayCommand(audioPlayer);
Command command2 = new RewindCommand(audioPlayer);
Command command3 = new StopCommand(audioPlayer);
macroCommand.add(command1);
macroCommand.add(command2);
macroCommand.add(command3);
System.out.println("========保存的命令=============");
macroCommand.execute();
}
interface MacroCommand extends Command {
/**
* 宏命令聚集的管理方法
* 可以添加一个成员命令
*/
void add(Command cmd);
/**
* 宏命令聚集的管理方法
* 可以删除一个成员命令
*/
void remove(Command cmd);
}
//具体的宏命令MacroAudioCommand类负责把个别的命令合成宏命令。
class MacroAudioCommand implements MacroCommand {
List<Command> list = new ArrayList<>();
@Override
public void execute() {
for (Command command : list) {
command.execute();
}
}
@Override
public void add(Command cmd) {
list.add(cmd);
}
@Override
public void remove(Command cmd) {
list.remove(cmd);
}
}