设计模式之命令模式

命令模式是一种行为设计模式,用于将请求封装为对象,降低了发送者与接收者间的耦合。该模式包括四个角色:命令、具体命令、接收者和调用者。通过遥控器控制家电的例子展示了如何实现命令模式,例如,遥控器作为调用者,电灯和电视作为接收者,而开灯和关灯命令是具体命令。这种模式允许在不修改原有代码的情况下添加新的设备,实现了请求发起者与执行者的解耦,并支持撤销和重做操作。然而,命令模式可能会导致系统中存在过多的具体命令类,增加复杂性。
摘要由CSDN通过智能技术生成

命令模式

命令模式(Command Pattern)又称为行动模式或交易模式,它是属于对象的行为模式。命令模式把一个请求或操作封装为一个对象,以便使用不同的参数来表示不同的请求(即命名),同时命令模式也支持撤销操作。

命令模式的核心是引入了一个命令类,通过命令类来降低发送者和接受者之间的耦合,让对象之间的调用关系更加灵活,实现解耦。

命令模式的四个角色

  • 命令角色(Command):这是一个抽象类或者接口,所有的命令都在这里。
  • 具体命令角色(ConcreteCommand):定义一个接受者对象并与动作绑定,调用接受者的相应操作来实现execute()方法。
  • 接受者角色(Receiver):具体实施和执行一个请求相关的操作,任何一个类都可以成为接受者,实施和执行请求的方法叫做行动方法。
  • 调用者角色(Invoker):负责调用命令对象执行请求。

img

举一个例子

使用一个遥控器对家里的智能家居进行控制,传统的家用电器是每一个设备有一个控制器,比如电视机有电视机的遥控器,空调有空调的遥控器。这里我们使用命令模式可以只用遥控器对所有的电器都进行简单的控制。

这里我们通过定义一个遥控器(调用者)来控制电灯和电视(接受者)。

Command:命令

创建一个命令的接口,里面定义执行命令的方法和撤销命令的方法。

package cn.personalweb.command;

public interface Command {
   
    /**
     * 执行命令操作
     */
    public void execute();

    /**
     * 撤销命令操作
     */
    public void undo();
}

LightReceiver:命令的接受者

创建一个命令的接受者的类,这里创建的是电灯命令的接受者,可以理解为电灯里的命令接受器,当他接受到相应命令后就执行相关方法。里面有两个方法,一个是电灯的开按钮,一个是电灯的关按钮。

package cn.personalweb.command;

public class LightReceiver {
   

    public void on(){
   
        System.out.println("电灯打开了...");
    }

    public void off() {
   
        System.out.println("电灯关闭了...");
    }
}

ConcreteCommand:具体命令角色

创建了两个类,分别是开灯命令关灯命令,他们都实现了Command接口,并且聚合了LightReceiver电灯接受者类。在LightOnCommandLightOffCommand中,execute()undo()方法调用了接受者LightReceiver的方法来实现方法。

LightOnCommand:开灯命令

package cn.personalweb.command;

public class LightOnCommand implements Command{
   

    private LightReceiver light;

    public LightOnCommand(LightReceiver light) {
   
        this.light = light;
    }

    @Override
    public void execute() {
   
        light.on();
    }

    @Override
    public void undo() {
   
        light.on();
    }
}

NoCommand:空命令

空命令,里面的方法没有进行任何操作,可用于初始化操作等其他作用。

package cn.personalweb.command;

/**
 * @program: DesignPattern
 * @description:
 * @author: lizheng
 * @create: 2020-09-25 22:35
 **/
public class NoCommand implements Command{
   

    @Override
    public void exe
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值