命令模式,升级版的灭霸响指

50 篇文章 0 订阅
44 篇文章 0 订阅

​ 大家好,我是洪爵,你看天上的星星,是不是排列组合成四个大字:设计模式。

​ 今天给大家讲的是命令模式,命令模式是一种行为性模式,行为性模式特别关注对象之间的通信。

​ 那么命令模式是干啥的,有什么用捏?话不多说,gogogo!

​ 命令模式其实随处可见,比如当你按下了空调遥控器,空调就会去做对应的指令;比如我们输入java -version命令,那么如果你成功安装了java,那么它就会对你的命令做出回应,输出相应的版本号到屏幕,linux系统里面输入ls,cd,cat等等都是命令模式。

​ 所以既然命令模式这么常见,我们还不学习起来!自己实现一个java -version!

​ 命令模式将请求以命令的形式(信号)放在对象中(按钮),并传给调用对象(电视遥控器),调用对象会去寻找能处理该命令的对象(电视),并把该命令传给该对象,让该对象执行对应的命令。

​ 大家有没有思考过为什么信号(属性)已经放在了按钮(对象)中,不能直接传给电视,而需要经过电视遥控器吗?

​ 因为过于耦合,行为请求者与行为实现者太过耦合会导致后续拓展的问题,如我现在想要对我的行为做记录、撤销或重做等,这种高耦合的系统设计就变得难以实现。

​ 类图:

在这里插入图片描述

上一波代码,彻底搞懂命令模式。

public class Computer {

    public void getResponse() {
        System.out.println("电脑响应");
    }
}

public abstract class Command {
    protected String key;

    void execute() {

    }
}

public class ClickCommand extends Command {

    Computer computer;

    public ClickCommand(Computer computer) {
        key = "click";
        this.computer = computer;
    }

    @Override
    public void execute() {
        computer.getResponse();
    }
}

public class SlidingRollerCommand extends Command {
    Computer computer;

    public SlidingRollerCommand(Computer computer) {
        key = "sliding";
        this.computer = computer;
    }

    @Override
    public void execute() {
        computer.getResponse();
    }
}

public class Mouse {
    
    // 存放对应的命令
    Map<String, Command> commandMap = new ConcurrentHashMap<>();
    
	// 存放日志信息
    List<String> bizLog = new ArrayList<>();

    public Mouse() {

    }

    private void logs(String key, String msg) {
        System.out.println(key + msg);
        bizLog.add(key + msg);
    }

    public void showLogs() {
        for(String log : bizLog) {
            System.out.println(log);
        }
    }

    public void addCommand(String key, Command command) {
        if(!Objects.isNull(commandMap.get(key))) {
            return;
        }
        logs(key, "是新加的命令");
        commandMap.put(key, command);
    }

    public void action(String key) {
        if(Objects.isNull(commandMap.get(key))) {
            return;
        }
        Command command = commandMap.get(key);

        logs(key, "被执行");
        command.execute();
    }

}

public class client {
    public static void main(String[] args) {
        // 接收命令者
        Computer computer = new Computer();

        // 具体命令
        Command clickCommand = new ClickCommand(computer);
        Command slidingRollerCommand = new SlidingRollerCommand(computer);

        // 执行命令着
        Mouse mouse = new Mouse();
        mouse.addCommand(clickCommand.key, clickCommand);
        mouse.addCommand(slidingRollerCommand.key, slidingRollerCommand);

        mouse.action(clickCommand.key);

        mouse.action(slidingRollerCommand.key);

        System.out.println("-----------------------------");

        mouse.showLogs();
    }
}

click是新加的命令
sliding是新加的命令
click被执行
电脑响应
sliding被执行
电脑响应
-----------------------------
click是新加的命令
sliding是新加的命令
click被执行
sliding被执行

​ 听懂掌声!类似的例子还有非常多,大家可以试着自己实现一版。

​ 好啦,本期命令模式就到这里啦,希望本篇文章对你有所帮助!


愿每个人都能带着怀疑的态度去阅读文章并探究其中原理。

道阻且长,往事作序,来日为章。

期待我们下一次相遇!
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KnightHONG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值