文章目录

  • 一、命令模式简介
  • 二、命令模式 适用场景
  • 三、命令模式 优缺点
  • 四、命令模式 与 备忘录模式
  • 五、命令模式 代码示例
    • 1、命令接口
    • 2、发布命令类
    • 3、关闭命令类
    • 4、游戏类
    • 5、命令执行者类
    • 6、测试类

一、命令模式简介


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

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

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

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

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

命令模式类型 : 行为型 ;

二、命令模式 适用场景


命令模式 适用场景 :

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

三、命令模式 优缺点


命令模式 优点 :

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

命令模式 缺点 :

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

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


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

五、命令模式 代码示例


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

业务场景 :

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

1、命令接口

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

2、发布命令类

package command;/*** 开放命令*      实现 Command 接口*      该类代表了一种命令*/
public class OpenCommand implements Command{private Game game;public OpenCommand(Game game) {this.game = game;}@Overridepublic void execute() {this.game.open();}
}

3、关闭命令类

package command;/*** 关闭命令*/
public class CloseCommand implements Command {private Game game;public CloseCommand(Game game) {this.game = game;}@Overridepublic void execute() {this.game.close();}
}

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 + " 关闭");}
}

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();}
}

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. 【设计模式】模板方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.模板方法模式简介 二.模板方法模式适用场景 三.模板方法模式优缺点 四.模板方法扩展 五.模板方法模式相关设计模式 六.模板方法模式代码示例 1.模板方法抽象类 2.模板方法实现类 1 ...

  2. 【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.策略模式简介 二.策略模式适用场景 三.策略模式优缺点 四.策略模式与其它设计模式 五.策略模式代码示例 1.促销策略接口 2.满减促销策略 3.返现促销策略 4.空促销策略 5.促销策 ...

  3. 【设计模式】中介者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.中介者模式简介 二.中介者模式适用场景 三.中介者模式优缺点 四.中介者模式 与 观察者模式 五.中介者模式 代码示例 1.聊天室 2.用户 3.运行实例 一.中介者模式简介 中介者模式 ...

  4. 【设计模式】状态模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.状态模式简介 二.状态模式适用场景 三.状态模式优缺点 四.状态模式相关设计模式 五.状态模式代码示例 1.状态类父类 2.播放状态类 3.暂停状态类 4.快进状态类 5.停止状态类 6 ...

  5. 【设计模式】访问者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.访问者模式简介 二.访问者模式 适用场景 三.访问者模式 优缺点 四.访问者模式 与 迭代器模式 五.代码示例 1.Game 父类 ( 被访问者 ) 2.VipGame 收费游戏 ( 被 ...

  6. 【设计模式】桥接模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.桥接模式简介 二.桥接模式适用场景 三.桥接模式优缺点 四.桥接模式相关设计模式 五.桥接模式代码示例 1.视频格式抽象 2.FLV 视频格式实现 3.MP4 视频格式实现 4.系统平台 ...

  7. 【设计模式】工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.工厂方法模式简介 二.工厂方法模式适用场景 三.工厂方法模式优缺点 四.工厂方法模式代码示例 1.产品抽象类 2.产品实现类 1 3.产品实现类 2 4.抽象工厂类 5.实现工厂类 1 ...

  8. 【设计模式】解释器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.解释器模式简介 二.解释器模式适用场景 三.解释器模式优缺点 四.解释器模式与适配器模式 五.解释器模式代码示例 1.解释器接口 2.加法解释器 3.乘法解释器 4.整型解释器 5.语法 ...

  9. 【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.建造者模式简介 二.建造者模式适用场景 三.建造者模式优缺点 四.建造者模式与工厂模式 五.建造者模式代码示例 1.学生类 2.建造者抽象类 3.建造者实现类 4.教师类 ( 非必须 ) ...

最新文章

  1. 网络推广专员浅析网络推广切忌一蹴而就
  2. 如何使一台计算机可以在互联网上访问到
  3. java 如何知道对象是否被修改过_Java 并发编程:AQS 的原子性如何保证
  4. android activity alias,动态更换桌标 Activity-alias
  5. 如何查阅相关工作所用到的文献资料
  6. 每天一道剑指offer-顺时针打印矩阵
  7. floyd算法求最短路径_算法题-蜜蜂采蜜最短路径
  8. 阿里云服务器如何隐藏真实ip
  9. MATLAB-高斯滤波的实现
  10. shiro+springMVC文档
  11. 12306排队是什么意思_12306订单请求排队中是什么意思
  12. 立冬、小雪、凛冬将至:如何理解美国科技企业裁员潮?
  13. 通过后台数据在百度地图标记多个点
  14. 【webservice】Two classes have the same XML type name(转)
  15. jquery.SuperSlide
  16. 学生信息管理系统——查询学生信息(Java+web综合)
  17. mysql死锁解决方法_mysql出现死锁的原因及解决方案
  18. 《RFID原理及应用》期末复习总结(1)
  19. TP-LINK路由器作为副路由器之Lan接口连接详解
  20. 防止 “黑天鹅”事件需态势感知 态势感知又如何实现?

热门文章

  1. docker一次构建,快速部署
  2. 是是非非本寻常,我们要不要跳槽
  3. Struts2 XML配置详解
  4. php中curl模拟post提交多维数组
  5. 《Microsoft Sql server 2008 Internals》读书笔记--第八章The Query Optimizer(5)
  6. 《构建之法》8.9.10
  7. C#学习笔记--详解委托,事件与回调函数
  8. love2d杂记9--光照效果
  9. java集合框架(Framework)的性能
  10. 如何配置Microsoft LoopBack Adapter 配置为系统的主网络适配器