命令模式
角色
- 接受者(Receiver)
请求的实际作用对象 - 抽象命令(Command)
声明了执行请求的execute方法 - 具体命令(ConcreteCommand)
调用实际操作对象,实现execute - 调用者(Invoker)
调用命令请求发送者
案例
功能键绑定
比如遥控器的功能键,现在想要实现为功能可以自定义绑定事件,请使用命令模式实现
WindowsHelper:接收者
/**
* Receiver
*/
public class WindowHelper {
public void min(){
System.out.println("窗口最小化");
}
public void exit(){
System.out.println("窗口退出");
}
}
Command:抽象命令
/**
* Command
*/
public interface Command {
public void execute();
}
MinCmd:窗口退出命令
/**
* ConcreteCommand:ExitCmd
*/
public class ExitCmd implements Command{
private WindowHelper windowHelper;
public ExitCmd() {
this.windowHelper = new WindowHelper();
}
@Override
public void execute() {
this.windowHelper.exit();
}
}
ExitCmd:窗口最小化命令
/**
* ConcreteCommand:MinCmd
*/
public class MinCmd implements Command{
private WindowHelper windowHelper;
public MinCmd() {
this.windowHelper = new WindowHelper();
}
@Override
public void execute() {
this.windowHelper.min();
}
}
FxBtn:功能键Invoker
/**
* Invoker
*/
public class FxBtn {
private Command command;
private String name;
public FxBtn(String name) {
this.name = name;
}
public void onClick() {
this.command.execute();
}
public void bindCommand(Command command) {
this.command = command;
}
}
Main:
public class Main {
public static void main(String... args){
/**
* 创建两个功能键
*/
FxBtn btn1 = new FxBtn("minilize");
FxBtn btn2 = new FxBtn("Exit");
/**
* 创建两个命令
*/
Command cmd1 = new MinCmd();
Command cmd2 = new ExitCmd();
/**
* 为功能键绑定命令
*/
btn1.bindCommand(cmd1);
btn2.bindCommand(cmd2);
btn1.onClick();
btn2.onClick();
/**
* 交换一下
*/
btn1.bindCommand(cmd2);
btn2.bindCommand(cmd1);
btn1.onClick();
btn2.onClick();
}
}
Output:
窗口最小化
窗口退出
窗口退出
窗口最小化
命令模式优缺点
优点:文章来源:https://www.toymoban.com/news/detail-485556.html
- 降低了系统耦合度,请求者和目标对象之间不直接引用
- 容易拓展新命令,符合开闭原则
- 可以配合队列实现命令批处理、宏命令
- 容易实现命令的 Undo 和 Redo 操作
缺点:文章来源地址https://www.toymoban.com/news/detail-485556.html
- 可能导致系统具有过多的命令类。
应用场景
- 需要将请求者和接收者解耦
- 分时请求
- 需要实现 Redo 和 Undo
- 命令组成宏命令
到了这里,关于设计模式-命令模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!