设计模式二十四章经之命令模式
时间:2022-06-01
本文章向大家介绍设计模式二十四章经之命令模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
概述
命令模式相对于其他模式没有那么多的规定,因为它不是一个很规矩的模式。不过,正因为这一点,命令模式对比其他设计模式更为灵活。我们接触比较多的命令模式无非开关机。我们点击关机命令时,它会先暂停事件,然后结束所有进程,最后关机。也就是说我只需要点击一个关机按钮就可以做到这一系列的命令。而我们的命令模式其实也和这一样。讲一系列的动作进行请求封装,用户只需要调用一个方法,这些动作会被挨个执行。
使用场景
需要抽象出待执行的动作,然后以参数的形式提供出来。类似于过程设计中的回调机制,而命令模式正是回调机制的一个面向对象的代替品。
在不同的时刻指定、排列和执行请求。一个命令对象可以有与初始请求无关的生存期。
需要支持取消操作。
需要支持事务操作。
支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。
具体实现
假设我们现在关机,它会先后关闭浏览器,音乐和QQ,最后才会关机。现在我们来模拟一下。
public class CloseReceiver{
public void action(){
System.out.println("关机");
}
public void closeQQ(){
System.out.println("关闭QQ");
action();
}
public void closeMusic(){
System.out.println("关闭音乐");
}
public void closeChrome(){
System.out.println("关闭浏览器");
}
}
public interface Close{
void execute();
}
public class QQClose implements Close{
private CloseReceiver receiver;
public QQClose(CloseReceiver receiver){
this.receiver=receiver;
}
@Override
public void excute(){
recevier.closeQQ();
}
}
public class MusicClose implements Close{
private CloseReceiver receiver;
public MusicClose(CloseReceiver receiver){
this.receiver=receiver;
}
@Override
public void excute(){
recevier.closeMusic();
}
}
public class ChromeClose implements Close{
private CloseReceiver receiver;
public ChromeClose(CloseReceiver receiver){
this.receiver=receiver;
}
@Override
public void excute(){
recevier.closeChrome();
}
}
public class Invoker{
private QQClose qqclose;
private MusicClose musicclose;
private ChromeClose chromeclose;
public setQQClose(QQClose qqclose){
this.qqclose=qqclose;
}
public setMusicClose(MusicClose musicclose){
this.musicclose=musicclose;
}
public setChromeClose(ChromeClose chromeclose){
this.chromeclose=chromeclose;
}
public void closeChrome(){
chromeclose.excute();
}
public void closeMusic(){
musicclose.excute();
}
public void closeQQ(){
qqclose.excute();
}
}
public void Client{
public static void main(String[] args){
CloseReceiver receiver=new CloseReceiver();
QQClose qqclose=new QQClose(receiver);
MusicClose musicclose=new MusicClose(receiver);
ChromeClose chromeclose=new ChromeClose(receiver);
Invoker invoker=new Invoker();
invoker.closeChrome();
invoker.closeMusic();
invoker.closeQQ();
}
}
最后输出:
关闭浏览器
关闭音乐
关闭QQ
关机
调用逻辑做的如此复杂是因为开发起来方便。每当增加或者修改关闭软件时,我们只需要处理CloseReceiver以及它对应的Close类即可。设计模式原则中有一个重要的原则,开闭原则。大家可以思考思考。
除此之外,命令模式可以实现记录命令的功能。如果我们在Invoker中用一个数据结构来存储这些执行的命令,以此可以知道刚才执行过什么命令,并可以在需要时恢复。
总结
在命令模式中,可以充分体验出设计模式的通病。类的膨胀。但其也有相应的优点。比如降低了系统的耦合度,新的命令可以添加到系统中去等等。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PCMAN FTP STOR命令栈溢出
- 一个基于ngrx的Angular图书搜索应用,带网络请求
- Android利用RecyclerView实现列表倒计时效果
- 【Flutter Unit 重大更新 1 】超好用的组件收藏夹上线
- android特卖列表倒计时卡顿问题的解决方法
- dotnet 多线程禁止同时调用相同的方法 禁止方法重入调用 双检锁的设计
- android实现倒计时功能(开始、暂停、0秒结束)
- 【-Flutter/Dart 语法补遗-】 sync* 和 async* 、yield 和yield* 、async 和 await
- android实现条目倒计时功能
- Android实现简单手电筒功能
- k8s安装自动证书签发cert-manager letsencrypt
- Android仿Keep运动休息倒计时圆形控件
- android通过led实现手电筒功能
- Android 7.0 手电筒控制实现
- 【STM32H7】第13章 RL-TCPnet V7.X之创建多个TCP客户端