Java版设计模式之【命令模式】

184 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

需求

前阵子帮一个朋友解决了多台设备通过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();
    }
}

小结

优点

  1. 降低了系统耦合度。
  2. 新的命令可以很容易添加到系统中去。

缺点

  1. 可能会导致系统中出现过多的具体命令类。

最后

文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!!!

如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!