本文章根据搜索命令模式的百度百科来进行理解的
使用场景
- 系统需要将请求调用者和接收者解耦,使得调用者和接收者不直接交互;
- 系统需要在不同的时间指定请求、将请求排队和指定请求;
- 系统需要支持命令的撤销操作和恢复操作;
- 系统需要将一组操作组合在一起,即支持宏命令。
概述
实现行为请求者和行为实现者松耦合,并将一组行为抽象为对象,这就是命令模式。
注:命令模式尝试以物件代替实际行动。
优点
- 降低对象之间的耦合度;
- 新的命令可以很容易加入到系统中;
- 可以比较容易地设计一个组合命令;
- 调用同一方法实现不同的功能。
实例分析
以电视机和遥控器为实例解析,电视机是请求的接收者,遥控器是请求的发送者,遥控器上的不同按钮对应电视机不同的操作,假设遥控器上有开机、关机和切换频道按钮。
- 创建电视机(命令接收者)
/**
* @author
* @date 2021/7/2
*
* desc:电视机类(命令接收者)
*/
public class Tv {
public int currentChannel = 0;
public void turnOn(){
System.out.println("TV IS ON");
}
public void turnOff(){
System.out.println("TV IS OFF");
}
public void turnChannel(int channel){
this.currentChannel = channel;
System.out.println("NOW TV CHANNEL IS:" + channel);
}
}
- 创建执行命令的接口
/**
* @author
* @date 2021/7/2
*
* desc:遥控器各个按钮的统一执行接口
* 遥控器通过该接口的execute方法发送命令给电视机需要执行的操作
*/
public interface Command {
void execute();
}
- 创建遥控器的开机命令
/**
* @author
* @date 2021/7/2
*
* desc:遥控器的开机命令
*/
public class CommandOfTurnOn implements Command {
private Tv onTv;
public CommandOfTurnOn(Tv onTv){
this.onTv = onTv;
}
public void execute() {
onTv.turnOn();
}
}
- 创建遥控器的关机命令
/**
* @author
* @date 2021/7/2
*
* desc:遥控器的关机命令
*/
public class CommandOfTurnOff implements Command{
private Tv offTv;
public CommandOfTurnOff(Tv offTv){
this.offTv = offTv;
}
public void execute() {
offTv.turnOff();
}
}
- 创建遥控器的切换频道命令
/**
* @author
* @date 2021/7/2
*
* desc:遥控器的频道切换命令
*/
public class CommandOfTurnChannel implements Command{
private Tv turnChannelTv;
private int channel;
public CommandOfTurnChannel(Tv turnChannelTv,int channel){
this.turnChannelTv = turnChannelTv;
this.channel = channel;
}
public void execute() {
turnChannelTv.turnChannel(channel);
}
}
- 创建遥控器类
/**
* @author
* @date 2021/7/2
*
* desc:遥控器类
*/
public class Control {
private Command commandOn,commandOff,commandChanl;
public Control(Command on,Command off,Command channel){
this.commandOn = on;
this.commandOff = off;
this.commandChanl = channel;
}
public void turnOn(){
commandOn.execute();
}
public void turnOff(){
commandOff.execute();
}
public void turnChannel(){
commandChanl.execute();
}
}
- 测试实现类
/**
* @author
* @date 2021/7/2
*/
public class Client {
public static void main(String[] args) {
// 电视机对象(接收遥控器的请求)
Tv myTv = new Tv();
//封装一个遥控器开始>>>>>>>>>>>>>>>
CommandOfTurnOn commandOfTurnOn = new CommandOfTurnOn(myTv);// 开机命令(开机按钮)
CommandOfTurnOff commandOfTurnOff = new CommandOfTurnOff(myTv);// 关机命令(关机按钮)
CommandOfTurnChannel commandOfTurnChannel = new CommandOfTurnChannel(myTv,2);// 切换频道命令(切换频道按钮)
Control control = new Control(commandOfTurnOn,commandOfTurnOff,commandOfTurnChannel); // 实现遥控器对象(获取一个遥控器)
//封装一个遥控器结束>>>>>>>>>>>>>>>
// 遥控器的按钮操作(即遥控器可以发出的命令)
control.turnOn(); // 遥控器操作开机按钮
control.turnOff(); // 遥控器操作关机按钮
control.turnChannel(); // 遥控器操作切换频道按钮
}
}
版权声明:本文为qq_35238590原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。