【设计模式】命令模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

举报
韩曙亮 发表于 2022/01/13 00:41:53 2022/01/13
【摘要】 文章目录 一、命令模式简介二、命令模式 适用场景三、命令模式 优缺点四、命令模式 与 备忘录模式五、命令模式 代码示例1、命令接口2、发布命令类3、关闭命令类4、游戏类5、命令执行者类6、测试类 ...





一、命令模式简介



命令模式 :不同的请求 封装成 不同的请求对象 , 以便 使用 不同的 请求 ; 对于接收者来说 , 可以识别 不同的 请求对象类型 , 然后执行 不同的操作 ;

命令模式 , 解决了 应用程序 中 , 对象的职责 ( 发送请求 / 执行请求 ) , 以及它们之间的 通信方式 ;

命令模式 可以使 命令的 发送者接收者 完全解耦 ; 发送者 和 接收者 之间 , 并没有直接的关系 , 二者靠 命令 进行交互 ;

命令发送者 只需要知道发送 请求对象 , 不需要知道如何完成请求 ;

命令执行者 只需要知道如何 完成请求 , 不需要知道请求的发送过程 ;


命令模式类型 : 行为型 ;





二、命令模式 适用场景



命令模式 适用场景 :

  • 解耦发送者与接收者 : 请求发送者请求接收者 ( 执行者 ) 需要 解耦 , 发送者 与 接收者 之间 不直接进行交互 ;
  • 抽象行为 : 需要将 等待执行 的行为 抽象出来 ;




三、命令模式 优缺点



命令模式 优点 :

  • 降低耦合 :请求 调用者请求 接收者 进行 解耦 ;
  • 扩展性高 : 如果要 扩展新命令 , 直接 定义 新的命令对象 即可 ; 如果要 执行一组命令 , 发送一组命令 给接收者 即可 ;

命令模式 缺点 :

  • 增加复杂度 : 扩展命令 会 导致 类的数量增加 , 增加了 系统实现的复杂程度 ;
    需要针对每个命令 , 都要开发一个与之对应的命令类 ;




四、命令模式 与 备忘录模式



命令模式 与 备忘录模式 : 可以通过 备忘录模式 保存 命令模式 的 命令 历史记录 , 可以获取 上一个命令 , 之前的某几个命令 等 ,





五、命令模式 代码示例



命令模式 的 核心 就是 将 命令 抽象成一个对象 ;

业务场景 :

游戏的 发布 和 关闭 , 使用命令模式实现 , 分别针对 发布 , 关闭 , 各自定义一个命令类 ;


1、命令接口


package command;

/**
 * 命令接口
 *      所有的命令都要实现该接口
 */
public interface Command {
    /**
     * 执行命令方法
     */
    void execute();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2、发布命令类


package command;

/**
 * 开放命令
 *      实现 Command 接口
 *      该类代表了一种命令
 */
public class OpenCommand implements Command{
    private Game game;

    public OpenCommand(Game game) {
        this.game = game;
    }

    @Override
    public void execute() {
        this.game.open();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

3、关闭命令类


package command;

/**
 * 关闭命令
 */
public class CloseCommand implements Command {
    private Game game;

    public CloseCommand(Game game) {
        this.game = game;
    }

    @Override
    public void execute() {
        this.game.close();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

4、游戏类


package command;

/**
 * 该类与命令执行的具体逻辑相关
 */
public class Game {
    private String name;

    public Game(String name) {
        this.name = name;
    }

    public void open() {
        System.out.println(this.name + " 开放");
    }

    public void close() {
        System.out.println(this.name + " 关闭");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

5、命令执行者类


package command;

import java.util.ArrayList;

/**
 * 命令接收者
 *      执行命令
 */
public class Manager {
    /**
     * 存放命令
     */
    private ArrayList<Command> commands = new ArrayList<>();

    /**
     * 添加命令
     * @param command
     */
    public void addCommand(Command command) {
        commands.add(command);
    }

    /**
     * 执行命令
     */
    public void executeCommand() {
        for (Command command : commands) {
            // 逐个遍历执行命令
            command.execute();
        }
        // 命令执行完毕后 , 清空集合
        commands.clear();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

6、测试类


package command;

public class Main {
    public static void main(String[] args) {
        Game game = new Game("Game 01");

        OpenCommand openCommand = new OpenCommand(game);
        CloseCommand closeCommand = new CloseCommand(game);

        // 发送命令
        Manager manager = new Manager();
        manager.addCommand(openCommand);
        manager.addCommand(closeCommand);

        // 执行命令
        manager.executeCommand();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

执行结果 :

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/119735683

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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