Java设计模式系列之命令模式

命令模式(Command)的定义

将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作,将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来。

命令模式(Command)的适用性

1.抽象出待执行的动作以参数化某对象。

2.在不同的时刻指定、排列和执行请求。

3.支持取消操作。

4.支持修改日志,这样当系统崩溃时,这样修改可以被重做一遍。

5.用构建在原语操作上的高层操作构造一个系统。

命令模式(Command)的应用效果:
1)command模式将调用操作的对象和实现该操作的对象解耦
2)可以将多个命令装配成一个复合命令,复合命令是Composite模式的一个实例
3)增加新的command很容易,无需改变已有的类

命令模式(Command)的参与者

  1.Command

声明执行操作的接口。

2.ConcreteCommand

将一个接收者对象绑定于一个动作。

调用接收者相应的操作,以实现Execute。

3.Client

创建一个具体命令对象并设定它的接收者。

4.Invoker

要求该命令执行这个请求。

5.Receiver

知道如何实现与执行一个请求相关的操作。任何类都可能作为一个接收者。

命令模式(Command)的UML类图

            

具体的代码实现:

第一步:定义Command,声明执行操作的接口

1 //命令接口
2 public interface Command {
3
4     //执行操作
5     public void excute();
6     //撤销操作
7     public void unDo();
8 }

第二步:定义ConcreteCommand,将一个接收者对象绑定于一个动作。

 1 public class ConcreteCommand implements Command {
 2
 3     // 持有一个接受者Receiver的引用,绑定一个特定的操作
 4     Receiver receiver;
 5
 6     public ConcreteCommand(Receiver receiver) {
 7         this.receiver = receiver;
 8     }
 9
10     @Override
11     public void excute() {
12         // 接受者绑定执行动作
13         receiver.action();
14     }
15
16     @Override
17     public void unDo() {
18         // 接受者绑定的撤销动作
19         receiver.unAction();
20     }
21 }

第三步:定义Receiver,知道如何实现与执行一个请求相关的操作

 1 public class Receiver {
 2
 3     public void action() {
 4         System.out.println("执行一个命令");
 5     }
 6
 7     public void unAction() {
 8         System.out.println("撤销一个命令");
 9     }
10 }

第四步:定义Invoker,要求该命令执行这个请求。

 1 public class Invoker {
 2
 3     // 调用者持有一个命令对象
 4     Command command;
 5
 6     public Command getCommand() {
 7         return command;
 8     }
 9
10     public void setCommand(Command command) {
11         this.command = command;
12     }
13
14     // 执行命令
15     public void excuteCommmand() {
16         command.excute();
17     }
18
19     // 撤销命令
20     public void undoCommand() {
21         command.unDo();
22     }
23 }

第五步:定义Clien,我们来测试一下我们的命令模式

 1 public class Client {
 2
 3     /**
 4      * @param args
 5      */
 6     public static void main(String[] args) {
 7         // 创建命令的接受者
 8         Receiver receiver = new Receiver();
 9         // 创建命令对象,并设定它的接受者
10         Command command = new ConcreteCommand(receiver);
11         // 创建命令执行者,并将相应的命令作为参数传递给Invoker
12         Invoker invoker = new Invoker();
13         invoker.setCommand(command);
14         // Client端测试一下
15         invoker.excuteCommmand();
16         invoker.undoCommand();
17     }
18
19 }

运行结果:

执行一个命令
撤销一个命令

总结:

1、在被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接收者和一个或一组动作;
2、调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用;
3、调用者可以接受命令当作参数,甚至在运行时动态的进行;
4、命令可以支持撤销,做法是实现一个undo()方法来回到execute()被执行前的状态;
5、命令模式将发出请求的对象和执行请求的对象进行解耦;

时间: 2024-10-21 17:19:57

Java设计模式系列之命令模式的相关文章

《Java设计模式》之命令模式

命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 命令模式的结构 定义 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于"行为请求者"与"行为实现者"解耦,可实现二者之间的松耦合,以便适应变化.分离变化与不变的因素. 角色 Comman

设计模式系列之命令模式

命令模式 1 使用场景 1. 命令的发送者和命令执行者有不同的生命周期.命令发送了并不是立即执行. 2. 命令需要进行各种管理逻辑. 3. 需要支持撤消\重做操作(撤销命令). 2 角色 2.1 client 1.创建具体的命令 2.设置命令的接受者 2.2 Command 1 定义命令的统一接口 2 command为所有命令声明了一个借口,调用命令对象的excute方法,就可以让接受者进行相关的操作 3 这个接口也具备撤销的方法 2.3 ConcreteCommand 1 Command接口的

Java设计模式系列之策略模式

策略模式的定义: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化. 策略模式使这些算法在客户端调用它们的时候能够互不影响地变化. 策略模式的意义:   策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是低耦合的关系. 低耦合的特性使软件具有更强的可扩展性,易于维护:更重要的是,它大大提高了软件的可重用性.    策略模式中有三个对象:      环境对象(Context):该类中实现了对抽象策略中

Java设计模式(六) Command(命令模式)及Tomcat引申

基本概念 Command 命令模式是一个高内聚的模式(满足单一职责原则) 概念:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 命令模式在项目中频繁使用,封装性和拓展性都有很好的保障 Command模式中的角色分工: Client:创建一个命令并决定接受者 Command:命令接口,定义一个抽象方法 Concrete Command:具体命令,负责调用接受者的相关操作 Invoker:请求者,负责调用命令对象执行请求 R

Java设计模式系列之状态模式

状态模式(State)的定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类 状态模式(State)适用性 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 2.一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态. 这个状态通常用一个或多个枚举常量表示. 通常,有多个操作包含这一相同的条件结构. State模式将每一个条件分支

Java设计模式系列之迭代器模式

迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么三个方法:取得下一个元素的方法next(),判断是否遍历结束的方法hasNext()),移出当前对象的方法remove(), (2)具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代. (3)容器角色(Aggregate): 

Java设计模式系列之桥接模式

桥接模式(Bridge)的定义 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 桥接模式(Bridge)的动机 当一种抽象类型可能有多种实现方式时,一般情况我们可以考虑使用继承来解决抽象类型的多种实现,在抽象类型中定义接口,而子类负责接口的具体实现.但这种做法缺乏灵活性,由于抽象类型和子类之间紧紧地绑定在一起,使得这种关系在运行时不能再修改,这使得它难以修改.扩展和重用

Java 设计模式系列(九)组合模式

Java 设计模式系列(九)组合模式 将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象的使用具有一致性. 一.组合模式结构 Component: 抽象的组件对象,为组合中的对象声明接口,让客户端可以通过这个接口来访问和管理整个对象结构,可以在里面为定义的功能提供缺省的实现. Leaf: 叶子节点对象,定义和实现叶子对象的行为,不再包含其它的子节点对象. Composite: 组合对象,通常会存储子组件,定义包含子组件的那些组件的行为,并实现在组件接口中定义

Java 设计模式系列(二三)访问者模式(Vistor)

Java 设计模式系列(二三)访问者模式(Vistor) 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变. 一.访问者模式结构 访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化. 数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象则反过来执行节点对象的操作.这样的过程叫做"双重分派