命令模式

简介: 定义:请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令,对请 求排队或者记录请求日志,可以提供命令的撤销和恢复功能优点:1.调用者角色与接收者角色之间没有任何依赖关系,松耦合。


定义:请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令,对请 求排队或者记录请求日志,可以提供命令的撤销和恢复功能

优点:1.调用者角色与接收者角色之间没有任何依赖关系,松耦合。

          2.Command可像其他的对象一样被操纵和扩展,可以增加和修改。可以装配成组合命令

          3从而客户端发出的请求可以在被处理之前都存放在Invoker类的容器中,可以在这个类中对请求排序,筛选,类似于aop

缺点:1.使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用

使用场景:1.在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理

                  2.队列

引申:1.命令模式结合其他模式会更优秀:命令模式可以结合责任链模式,实现命令族解析任务;结合模板方法模式,则可以减少 Command子类的膨胀问题。

类图:

image.png

Receiver 要执行的方法

代码

Receiver类

1. class Receiver{
2. void auxiliary() {
3.         System.out.println("滚去辅助");
4.     }
5. void fightWild() {
6.         System.out.println("滚去打野");
7.     }
8. void hangUp() {
9.         System.out.println("滚去挂机");
10.     }
11. }

Command (固定写法)

1. public interface Command {
2. /**
3.      * @MethodName execute
4.      * @Descrition 命令执行。命令执行之前和之后可做自己想要的操作
5.      * @Param []
6.      * @return void
7.      */
8. void execute();
9. }

ConcreteCommand(固定写法 实现接口 去调用接受者的方法)

1. public class ConcreteCommandA implements Command{
2. 
3. private Receiver receiver;//持有行为执行者的引用
4. 
5. public ConcreteCommandA(Receiver receiver) {
6. this.receiver = receiver;
7.     }
8. 
9. @Override
10. public void execute() {
11.         receiver.auxiliary();
12.     }
13. }
1. public class ConcreteCommandB implements Command{
2. 
3. private Receiver receiver;//持有行为执行者的引用
4. 
5. public ConcreteCommandB(Receiver receiver) {
6. this.receiver = receiver;
7.     }
8. 
9. @Override
10. public void execute() {
11.         receiver.fightWild();
12.     }
13. }

Invoker(个人理解如同队列 将Command临时放入放入)

1. public class Invoker {
2. private Command command;//持有命令类的引用
3. 
4. public Invoker(Command command) {
5. this.command = command;
6.     }
7. 
8. //get set方法
9. 
10. /**
11.      * @MethodName toMakeIt
12.      * @Descrition 执行请求
13.      * @Param []
14.      * @return void
15.      */
16. public void toMakeIt(){
17.         command.execute();
18.     }
19. }

调用

1. public class Client {
2. public static void main(String[] args) {
3. //生成队列
4. Invoker  invoker = new Invoker();
5. Command commandA = new ConcreteCommandA(new Receiver())
6.         invoker.setCommand(commandA);
7.         invoker.toMakeIt();
8. Command commandB = new ConcreteCommandA(new Receiver())
9.         invoker.setCommand(commandB );
10.         invoker.toMakeIt();
11. 
12.     }
13. }

 


相关文章
|
6月前
|
存储 设计模式 调度
行为型 命令模式
行为型 命令模式
40 1
|
28天前
|
设计模式 存储 C#
C# 一分钟浅谈:命令模式与职责链模式
【10月更文挑战第16天】本文介绍了命令模式和职责链模式两种行为设计模式。命令模式将请求封装成对象,支持可撤销操作;职责链模式将请求沿处理者链传递,支持动态添加或删除处理者。文章通过C#代码示例详细解释了这两种模式的核心组件、优点、缺点及常见问题,并提供了如何避免这些问题的建议。
32 5
|
5月前
|
设计模式
命令模式-大话设计模式
命令模式-大话设计模式
|
11月前
|
存储
命令模式
命令模式
47 0
|
设计模式
命令模式解读
命令模式解读
|
存储 前端开发
关于命令模式我所知道的
关于命令模式我所知道的
91 0
|
存储 Java 程序员
行为型模式-命令模式
行为型模式-命令模式
112 0
|
设计模式 存储
我学会了,命令模式
命令模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
118 0
我学会了,命令模式
|
设计模式 Java 中间件
Java设计模式 ->命令模式
Java设计模式 ->命令模式
81 0
|
Java 程序员 uml
这就是命令,命令模式
命令模式:请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
137 0
这就是命令,命令模式