深入理解Java设计模式之命令模式

作者:一指流砂~ 时间:2023-11-24 11:06:31 

一、什么是命令模式

命令模式是一个高内聚的模式,其定义为:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请 求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

深入理解Java设计模式之命令模式

在该类图中,我们看到三个角色:

  • Receiver接受者角色:该角色就是干活的角色,命令传递到这里是应该被执行的

  • Command命令角色:需要执行的所有命令都在这里声明

  • Invoker调用者角色:接收到命令,并执行命令

二、命令模式的使用场景

使用时机:当需要先将一个函数登记上,然后再以后调用此函数时,就需要使用命令模式,其实这就是回调函数。

有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系

例子:拿订餐来说,客人需要向厨师发送请求,但是完全不知道这些厨师的名字和联系方式,也不知道厨师炒菜的方式和步骤。 命令模式把客人订餐的请求封装成 command 对象,也就是订餐中的订单对象。这个对象可以在程序中被四处传递,就像订单可以从服务员手中传到厨师的手中。这样一来,客人不需要知道厨师的名字,从而解开了请求调用者和请求接收者之间的耦合关系

三、命令模式的优缺点

优点:

类间解耦:调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Command 抽象类的execute方法就可以,不需要了解到底是哪个接收者执行。可扩展性:Command的子类可以非常容易地扩展,而调用者Invoker和高层次的模块Client不产生严 重的代码耦合。命令模式结合其他模式会更优秀:命令模式可以结合责任链模式,实现命令族解析任务;结合模板方法模式,则可以减少 Command子类的膨胀问题。

缺点:

命令模式也是有缺点的,请看Command的子类:如果有N个命令,问题就出来 了,Command的子类就可不是几个,而是N个,这个类膨胀得非常大,这个就需要读者在项 目中慎重考虑使用。

四、命令模式的实现

Receiver类,知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接受者


class Receiver
{
   public void Action()
   {
       Console.WriteLine("执行请求!");
   }
}

Command类,用来声明执行操作的接口


abstract class Command
{
   protected Receiver receiver;
   public Command(Receiver receiver)
   {
       this.receiver = receiver;
   }
   abstract public void Execute();
}

ConcreteCommand类,将一个接受者对象绑定于一个动作,调用接受者相应的操作,以实现Execute。


class ConcreteCommand : Command
{
   public ConcreteCommand(Receiver receiver) : base(receiver)
   {
   }
    public override void Execute()
   {
       receiver.Action();
   }
}

Invoker类,要求该命令执行这个请求


class Invoker
{
   private Command command;
   public void SetCommand(Command command)
   {
       this.command = command;
   }
   public void ExecuteCommand()
   {
       command.Execute();
   }
}

客户端代码


static void Main(string[] args)
{
   Receiver r = new Receiver();
   Command c = new ConcreteCommand(r);
   Invoker i = new Invoker();
    i.SetCommand(c);
   i.ExecuteCommand();
    Console.Read();
}

五、总结

命令模式的意图是将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

命令模式主要解决的问题是在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合,这是命令模式的使用场景。

系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式

命令模式的实现过程通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。

来源:https://www.cnblogs.com/xuwendong/p/9814421.html

标签:Java,设计模式,命令模式
0
投稿

猜你喜欢

  • 使用MAT进行JVM内存分析实例

    2023-12-14 05:29:51
  • java调用淘宝api联网查询ip归属地

    2022-06-11 12:21:20
  • SpringBoot如何整合redis实现过期key监听事件

    2023-08-04 18:51:19
  • 一文带你学会Spring JDBC的使用

    2023-11-29 17:05:34
  • C# 中AutoMapper的使用方法

    2023-04-06 13:17:04
  • C语言程序设计50例(经典收藏)

    2023-07-10 08:33:19
  • c#反射调用方法示例

    2022-07-14 15:28:40
  • ArrayList的自动扩充机制实例解析

    2021-10-20 17:38:29
  • SpringBoot使用Sharding-JDBC实现数据分片和读写分离的方法

    2023-07-27 02:15:50
  • java复制文件的4种方式及拷贝文件到另一个目录下的实例代码

    2023-05-15 16:03:25
  • .net实现裁剪网站上传图片的方法

    2021-09-24 01:41:05
  • SpringBean依赖和三级缓存的案例讲解

    2023-06-25 09:33:22
  • android surfaceView实现播放视频功能

    2022-12-11 12:55:04
  • java语言实现猜数字游戏

    2023-11-24 00:19:38
  • java Stream流常见操作方法(反射,类加载器,类加载,反射)

    2022-03-24 06:54:56
  • c# 对cookies(增、删、改、查)的操作方法

    2023-08-10 06:24:48
  • C#统计C、C++及C#程序代码行数的方法

    2022-10-04 16:19:37
  • Java设计模式之模板方法模式详解

    2021-08-04 04:32:51
  • springboot 使用Spring Boot Actuator监控应用小结

    2021-10-02 10:07:27
  • Maven配置多仓库无效的解决

    2023-11-29 04:37:10
  • asp之家 软件编程 m.aspxhome.com