命令模式
来源:互联网 发布:淘宝小样四大靠谱店 编辑:程序博客网 时间:2024/06/06 21:33
命令模式介绍
命令模式,是行为型设计模式之一。命令模式相对于其他的设计模式来说并没有那么多的条条框框,其实它不是一个很规矩的模式,不过,就是基于这一点,命令模式相对于其他的设计模式更为灵活多变。我们接触比较多的命令模式大多数是程序菜单命令。如关机,系统会执行暂停处理,保存系统配置,然后结束程序进程,最后调用内核命令关闭计算机等。
命令模式的定义
将一个请求封装成一个对象,从而让用户使用不同的请求客户端参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。
命令模式的使用场景
需要抽象出待执行的动作,然后已参数的形式提供出来,类似于过程设计中的毁掉机制,而命令模式正是回调机制的一个面向对象的替代品。
命令模式的UML类图
代码示例:
命令接收,执行类:
public class Receiver { public void action(){ System.out.println("Receive something,run action"); }}
命令接口
public interface Command { public void execute();}
具体命令类
public class ConcreteCommand implements Command { private Receiver receive = null; private String status; //构造方法传Receiver参数 public ConcreteCommand(final Receiver receiver) { this.receive = receiver; } @Override public void execute() { this.receive.action();//调用Receiver类的执行方法 }}
public class Invoker { private Command command = null; public Command getCommand(){ return command; } public void setCommand(final Command command){ this.command = command; } public void runCommand(){ this.command.execute(); }}
客户端
public class Client { public static void main(String[] args) { assemble(); } public static void assemble() { final Receiver receiver = new Receiver(); final Command command = new ConcreteCommand(receiver); final Invoker invoker = new Invoker(); invoker.setCommand(command); invoker.runCommand(); }}
运行结果:
Receive something,run action
这是简单的命令模式的实现,通过Invoker类执行相应的操作,具体执行给了具体的命令实现类ConcreteCommand.ConcreteCommand类执行命令方法调用的是Receiver类里面的方法,最终执行。中间的Command实现类是中间隔的一层,降低系统的耦合度,也会造成Command类的冗余。
优点:
降低系统的耦合度
新的命令可以很容易的加入到系统中,通过创建不同的命令Receiver接收者,在命令接收者里面实现一系列的命令,可以是组合在一起的命令,如关机操作。
缺点:
使用命令模式可能导致过多的具体命令类(继承Command类)这个类只是接收Receiver类参数,调用Receiver类里面的方法,没有具体的逻辑。如果系统命令多会产生很多的命令类。
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- linux cp命令参数及用法详解---linux 复制文件命令cp
- AOP无法切入同类调用方法的解决办法
- iOS开发-版本管理常用git命令
- 从MultipartFile获取File式的inputStream
- Flink学习笔记 --- 理解DataStream WordCount
- 命令模式
- UVA 11549 Calculator Conundrum Floyd判圈算法 Brent判圈算法 相关性质及证明
- issue-15 了解闭包里如何使用外围作用域里的变量
- HorizontalScrollView 初始化第一次时使用smoothScrollTo无效的解决办法
- SOAPUI测试步骤(七)---DataSink TestStep
- shell脚本
- 括号匹配Java实现
- Java的回调
- 第三季第一节课——题目1