首页 > 其他分享 >开关不一定是开关灯用 - 命令模式(Command Pattern)

开关不一定是开关灯用 - 命令模式(Command Pattern)

时间:2025-01-10 12:30:27浏览次数:3  
标签:命令 Pattern void 灯用 开关 Command light command public

命令模式(Command Pattern)

命令模式(Command Pattern)

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为对象,从而使你可以用不同的请求对客户进行参数化、队列或者日志请求,以及支持可撤销的操作。命令模式的核心思想是将“请求”作为一个对象来处理,将发出请求的责任和执行请求的责任分割开。

太抽象了,我们还是举个现实中的例子
假如你现在在装修家,你很有可能要买一个开关。但是我们这个开关不一定是用来开关灯的,也有可能是用来控制别的东西,所以这个开关不一定是跟灯是关联的。我们的开关你可以当成我们面向对象设计里面的一个对象,它不跟灯有直接的耦合关系。开关相当于发送者,开关与什么用电器关联,开关就控制哪一个用电器。实际上你可以这样理解命令模式,通过使用命令模式,我们隔离发送请求的与执行请求的对象。

命令设计模式

命令设计模式结构图

在这里插入图片描述

命令设计模式涉及的角色

  1. 命令接口(Command):声明了所有具体命令必须实现的方法
public interface Command {
    void execute();
    void undo(); // 可选,用于撤销操作
}
  1. 具体命令(ConcreteCommand):实现了Command接口的具体类。每个具体命令都包含对一个接收者的引用,并负责调用接收者的方法来执行实际的操作。
public class ConcreteCommand implements Command {
    private final Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        receiver.performAction();
    }

    @Override
    public void undo() {
        receiver.undoAction(); // 假设接收者有撤销功能
    }
}
  1. 接收者(Receiver):接收者知道如何执行与请求相关的操作。任何类都可以成为接收者,只要它提供了可以被命令对象调用的方法。
public class Receiver {
    public void performAction() {
        System.out.println("Executing action in Receiver");
    }

    public void undoAction() {
        System.out.println("Undoing action in Receiver");
    }
}
  1. 请求发送者(Invoker):请求发送者持有一个命令对象,并负责调用命令对象的execute()方法来触发请求。发送者不需要知道具体的接收者是谁,也不需要知道请求的具体内容。
public class Invoker {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void executeCommand() {
        if (command != null) {
            command.execute();
        }
    }

    public void undoCommand() {
        if (command != null) {
            command.undo();
        }
    }
}
  1. 客户端(Client):客户端创建具体的命令对象,并将其与接收者关联起来。然后,客户端将命令对象传递给请求发送者,由发送者在适当的时候调用命令对象的execute()方法。
public class Client {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command command = new ConcreteCommand(receiver);
        Invoker invoker = new Invoker();

        invoker.setCommand(command);
        invoker.executeCommand(); // 执行命令

        invoker.undoCommand(); // 撤销命令
    }
}

talk is cheap, show you my code

我们还是把我们举得例子转化成代码:

  1. 定义接收者(Receiver):首先,我们定义Light类,它包含打开和关闭灯光的方法。
public class Light {
    public void on() {
        System.out.println("The light is ON.");
    }

    public void off() {
        System.out.println("The light is OFF.");
    }
}
  1. 定义命令接口(Command Interface):接下来,我们定义一个命令接口Command,所有具体命令都必须实现这个接口。
public interface Command {
    void execute();
}
  1. 实现具体命令(Concrete Commands)
public class LightOnCommand implements Command {
    private final Light light;

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

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

public class LightOffCommand implements Command {
    private final Light light;

    public LightOffCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.off();
    }
}
  1. 定义请求发送者(Invoker)
    现在,我们创建一个Switch类作为请求发送者。它持有一个命令对象,并负责调用命令对象的execute()方法。
public class Switch {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void press() {
        if (command != null) {
            command.execute();
        } else {
            System.out.println("No command set.");
        }
    }
}
  1. 客户端代码(Client)
public class Client {
    public static void main(String[] args) {
        // 创建接收者
        Light light = new Light();

        // 创建命令对象
        Command lightOn = new LightOnCommand(light);
        Command lightOff = new LightOffCommand(light);

        // 创建请求发送者并设置命令
        Switch switchButton = new Switch();
        switchButton.setCommand(lightOn);
        switchButton.press(); // 执行打开灯光命令

        switchButton.setCommand(lightOff);
        switchButton.press(); // 执行关闭灯光命令
    }
}

最后,在客户端代码中,我们将创建一个Light实例,以及相应的LightOnCommand和LightOffCommand实例。然后,我们将这些命令设置到Switch对象中,并通过调用press()方法来触发命令的执行。

总结

命令模式的主要优点包括:

  1. 降低了系统的耦合度。
  2. 新的命令可以很容易地加入到系统中。
  3. 可以方便地实现对请求的撤销和重做。
    不过,命令模式也可能增加系统的复杂性,因为它需要引入许多新的类。如果系统比较简单,使用命令模式可能会显得过于繁琐。

标签:命令,Pattern,void,灯用,开关,Command,light,command,public
From: https://blog.csdn.net/Zongkunxue/article/details/145044006

相关文章

  • log4j的配置ConversionPattern详细讲解
    先写下我一直没找到的ConversionPattern里面参数代表的详细含义参数说明例子%c列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间log4j配置文件参数举例输出显示媒介假设当前logger......
  • 一个个顺序挨着来 - 责任链模式(Chain of Responsibility Pattern)
    责任链模式(ChainofResponsibilityPattern)责任链模式(ChainofResponsibilityPattern)责任链模式(ChainofResponsibilityPattern)概述责任链结构图责任链模式概述责任链模式涉及的角色talkischeap,showyoumycode总结责任链模式(ChainofResponsibilityPatt......
  • Structural Pattern Matching(match 语句)
    StructuralPatternMatching:翻译过来应该是结构化的模式匹配。从python3.10开始提供了matchstatement。它远比简单的其它语言中的那种switch语句功能强大的多。通过一个例子来了解一下这种语句的用法。假设我们有一个函数,用来区分用户做的操作,并将其打印出来。我们使用js......
  • Java设计模式 —— 【行为型模式】命令模式(Command Pattern) 详解
    文章目录模式介绍优缺点适用场景结构案例实现注意事项模式介绍有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系。拿订餐来说......
  • Windows 一分钟快速查看电脑开关时间
    这里写目录标题引言一、查看Windows日志二、使用脚本命令查看启动时间三、其他3.1终端(CMD)输入命令-只能看最近一次开机时间3.2自己写脚本,开关机时候记录-较繁琐3.3参考其他ID的日志引言通过查看电脑的开关时间:可以了解自己在一天中的电脑使用情况,包括使用......
  • 开关柜局放在线监测系统
    在电力系统中,开关柜作为关键的电气设备,其绝缘性能的可靠性直接关系到电力系统的安全稳定运行。局部放电(PartialDischarge,PD)是导致开关柜绝缘性能劣化的重要因素之一。局部放电不仅会导致电介质的局部损坏,而且在长期存在的情况下,还可能引发绝缘劣化甚至击穿,从而导致......
  • 复杂对象的创建与组装 - 建造者模式(Builder Pattern)
    建造者模式(BuilderPattern)建造者模式(BuilderPattern)建造者模式(BuilderPattern)概述建造者模式结构图代码talkischeap,showyoumycode总结建造者模式(BuilderPattern)建造者模式(BuilderPattern)是一种创建型设计模式,它允许你分步骤构建复杂对象。该模式将一个......
  • 你内部啥样跟我没关系 - 迭代器模式(Iterator Pattern)
    迭代器模式(IteratorPattern)迭代器模式(IteratorPattern)迭代器模式概述迭代器模式结构图迭代器模式涉及的角色talkischeap,showyoumycode总结迭代器模式(IteratorPattern)迭代器模式(IteratorPattern)是一种行为型设计模式,它提供了一种方法顺序访问一个聚合对象......
  • CanvasContext.createPattern
    CanvasContext.createPattern(stringimage,stringrepetition)CanvasContext是旧版的接口,新版Canvas2D接口与Web一致从基础库2.9.0开始,本接口停止维护,请使用RenderingContext代替基础库1.9.90开始支持,低版本需做兼容处理。小程序插件:支持相关文档:旧版画......
  • HTML5 开关(Toggle Switch)详细讲解
    HTML5开关(ToggleSwitch)详细讲解1.任务概述开关(ToggleSwitch)是一种用于表示二元状态(如开/关)的用户界面控件。用户可以通过点击开关来切换状态,常见于设置选项、开关功能等场景。2.代码结构以下是实现开关控件的完整代码:<!DOCTYPEhtml><htmllang="zh"><head>......