小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
需求
前阵子帮一个朋友解决了多台设备通过netty连接通信的问题。今天那朋友又过来找我了,跟我说现在有一个需求,客户端发送命令给服务端,服务端需要根据客户端传输的命令做相应操作,比如打开监控,关闭监控,重启设备等等。目前没有什么头绪,问我有没有什么解决方法。
概述
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
适用场景
- 接收命令的地方
- 系统需要支持命令的撤销或者恢复等操作的场景
角色
命令接口:申明需要执行的命令。
具体命令:实现命令方法,并调用接收者的相应操作。
调用者:负责调用命令对象执行请求。
接收者:负责具体实施和执行一个请求。
代码实现
命令接口:申明需要执行的命令
public interface MyCommand {
public void execute();
}
具体命令:定义了打开监视器,关闭监视器与退出按钮。
public class WhiteCommand extends JButton implements MyCommand {
private JPanel p;
public WhiteCommand(String name, JPanel p) {
// 构造一个按钮控件
super(name);
this.p = p;
}
@Override
public void execute() {
// 改变面板的背景颜色, 模拟打开监视器效果
p.setBackground(Color.WHITE);
}
}
public class BlackCommand extends JButton implements MyCommand {
private JPanel p;
public BlackCommand(String name, JPanel p) {
// 构造一个按钮控件
super(name);
this.p = p;
}
@Override
public void execute() {
// 改变面板的背景颜色, 模拟打开监视器效果
p.setBackground(Color.BLACK);
}
}
public class ExitCommand extends JButton implements MyCommand {
public ExitCommand(String name) {
// 构造一个按钮控件
super(name);
}
@Override
public void execute() {
// 系统退出,模拟退出效果
System.exit(0);
}
}
接收者:负责具体命令的执行
public class MyFrame extends JFrame implements ActionListener {
private JPanel p;
private WhiteCommand btnWhite;
private BlackCommand btnBlack;
private ExitCommand btnExit;
public MyFrame() {
super("命令模式");
p = new JPanel();
this.add(p);
// 实例化具体命令
btnWhite = new WhiteCommand("打开监视器", p);
btnBlack = new BlackCommand("关闭监视器", p);
btnExit = new ExitCommand("退出");
// 将按钮控件添加到面板
p.add(btnWhite);
p.add(btnBlack);
p.add(btnExit);
// 添加监听对象
btnWhite.addActionListener(this);
btnBlack.addActionListener(this);
btnExit.addActionListener(this);
// 设置窗体
p.setBackground(Color.BLACK);
this.setSize(400, 300);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
MyCommand obj = (MyCommand) e.getSource();
obj.execute();
}
}
小结
优点
- 降低了系统耦合度。
- 新的命令可以很容易添加到系统中去。
缺点
- 可能会导致系统中出现过多的具体命令类。
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!!!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!