模式19.命令模式-Java

本文介绍命令模式的基本概念,包括其定义、实现代码示例及应用场景。通过将请求封装成对象,命令模式支持请求的日志记录、撤销操作等功能,并提供了一个解耦请求发起者与执行者的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定义

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队活记录请求日志,以及支持可撤销的操作。

在这里插入图片描述

类比:

在这里插入图片描述

2.基本代码

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

package designmode.order;

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

(2)ConcreteCommand类,将一个接收者绑定与一个动作,调用接收者相应的操作,以实现执行动作

package designmode.order;

public class ConcreteCommand extends  Command{
    public ConcreteCommand(Receiver receiver){
        super(receiver);
    }

    @Override
    public void Execute() {
        receiver.action();
    }
}

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

package designmode.order;

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

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

package designmode.order;

public class Receiver {
    public void action(){
        System.out.println("执行请求!");
    }
}

(5)客户端代码。创建一个具体命令对象并设定它的接收者

package designmode.order;

public class Client {
    public static void main(String[] args) {
        Receiver receiver=new Receiver();
        Command command=new ConcreteCommand(receiver);
        Invoker i=new Invoker();

        i.SetCommand(command);
        i.ExecuteCommand();
    }
}

执行请求!

Process finished with exit code 0

3.应用场景

(1)优点

  • 能较容易设计一个命令队列
  • 在需要的情况下,可以较容易地将命令计入日志
  • 允许接收请求地一方决定是否要否定请求
  • 可以容易的实现对请求的撤销和重做
  • 由于加进新的具体命令类不影响其他的类,因此增加新的具体命令很容易。
  • 把请求一个操作的对象(eg客户)与知道怎么执行一个操作的对象(eg厨师)分隔开。

(2)在不清楚是否需要某个功能时, 要不要实现命令模式?

不实现。 敏捷开放的原则,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不着急去实现它,实际上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才更有意义。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值