白话-23种设计模式16-命令模式

举报
object 发表于 2022/07/09 16:16:29 2022/07/09
【摘要】 一、白话  看电视时,我们都是通过遥控机来操作电视,如开机,关机,换台。这就是对命令模式的一种使用。二、定义  命令模式,请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。● Receive接收者角色:该角色就是干活的角色,命令传递到这里是应该被执行的,具体到我们上面的例子中就是Group的三个实现类。● Comm...

一、白话

  看电视时,我们都是通过遥控机来操作电视,如开机,关机,换台。这就是对命令模式的一种使用。

二、定义

  命令模式,请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

Receive接收者角色:该角色就是干活的角色,命令传递到这里是应该被执行的,具体到我们上面的例子中就是Group的三个实现类。

Command命令角色:需要执行的所有命令都在这里声明。

Invoker调用者角色接收到命令,并执行命令

三、示例

// 抽象接受者-统一所有接受者需要的实现的细节
public interface Receive {
    public void turnOn();
    public void turnOff();
}
// 具体接收者 - 电视
public class TV implements Receive {

    @Override
    public void turnOn() {
        System.out.println("电视开机");
    }

    @Override
    public void turnOff() {
        System.out.println("电视关机");
    }
}
// 抽象命令角色-所有具体命令共同接口
public interface Command {
    void execute();
}
// 具体命令角色-关机命令
public class TurnOffCommand implements Command {
    Receive receive;

    public TurnOffCommand(Receive receive) {
        this.receive = receive;
    }

    @Override
    public void execute() {
        receive.turnOff();
    }
}
// 具体命令角色-开机命令
public class TurnOnCommand implements Command {
    Receive receive;

    public TurnOnCommand(Receive receive) {
        this.receive = receive;
    }

    @Override
    public void execute() {
        receive.turnOn();
    }
}
// 调用者角色-接收命令,并执行命令 遥控板
public class Invoker {
    // 命令
    List<Command> commands = new ArrayList<>();

    // 接收命令
    public void addCommand(Command command){
        commands.add(command);
    }

    // 执行命令
    public void action(){
        for (Command command : commands) {
            command.execute();
        }
    }
}
public class CommandApplication {
    // 客户端调用
    public static void main(String[] args) {
        // 新增调用者
        Invoker invoker = new Invoker();
        // 新增接收者
        Receive tv = new TV();
        // 新增命令 并绑定接受者
        Command turnOnCommand = new TurnOnCommand(tv);
        Command turnOffCommand = new TurnOffCommand(tv);
        // 调用者 接收命令 并 执行命令
        invoker.addCommand(turnOnCommand);
        invoker.addCommand(turnOffCommand);

        invoker.action();
    }
}

输出示例:

   电视开机
   电视关机

四、总结

  特点:降低了系统耦合度。新的命令可以添加到系统中去。容易导致具体命令类过多。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。