首页 > 其他分享 >十九:命令模式:统一的行动力

十九:命令模式:统一的行动力

时间:2023-04-30 14:02:15浏览次数:31  
标签:tv void 模式 命令 TV 十九 public

a. 命令模式解读

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而可以使用不同的请求对客户进行参数化。命令模式的关键在于将请求的发起者和请求的执行者解耦,使得请求的发起者不需要知道请求的具体实现细节,只需要调用相应的命令对象即可。 命令模式主要包括以下角色: 1、抽象命令(Command):定义命令的接口,通常包含一个execute()方法用于执行命令。 2、具体命令(ConcreteCommand):实现抽象命令接口,负责执行具体的命令操作。 3、调用者(Invoker):负责调用命令,通常不直接执行命令,而是将命令传递给接收者。 4、接收者(Receiver):负责处理具体的命令逻辑。

b. 动手实践:命令模式示例

假设我们要为电视遥控器设计一个简单的命令模式。首先,我们定义抽象命令接口:

public interface Command {
    void execute();
}

然后,我们创建具体命令类,例如电视打开和关闭命令:

public class TurnOnCommand implements Command {
    private TV tv;

    public TurnOnCommand(TV tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.turnOn();
    }
}

public class TurnOffCommand implements Command {
    private TV tv;

    public TurnOffCommand(TV tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.turnOff();
    }
}

接下来,我们创建调用者类(遥控器):

public class RemoteControl {
    private Command command;

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

    public void pressButton() {
        command.execute();
    }
}

最后,我们创建接收者类(电视):

public class TV {
    public void turnOn() {
        System.out.println("TV is turned on");
    }

    public void turnOff() {
        System.out.println("TV is turned off");
    }
}

现在我们可以在客户端代码中使用这些类:

public class Main {
    public static void main(String[] args) {
        TV tv = new TV();
        RemoteControl remoteControl = new RemoteControl();

        remoteControl.setCommand(new TurnOnCommand(tv));
        remoteControl.pressButton();

        remoteControl.setCommand(new TurnOffCommand(tv));
        remoteControl.pressButton();
    }
}

c. 优劣辨析:命令模式的效果

优点:

1、请求的发送者和接收者解耦:命令模式将请求的发送者与接收者进行解耦,使得发送者无需关心接收者的具体实现。 2、易扩展与修改:新增命令或者修改命令的实现都相对容易,遵循开闭原则。 3、支持撤销与恢复操作:命令模式可以通过实现额外的撤销(undo)和恢复(redo)方法来支持操作的撤销和恢复。 4、可将多个命令组合成宏命令:命令模式可以将多个命令组合成一个宏命令,实现一键执行多个操作的功能。

缺点:

1、产生更多的类:每个具体命令都需要实现一个类,导致系统中类的数量增加。 2、可能导致某些系统的过度设计:在一些简单的场景下,使用命令模式可能导致系统变得过于复杂。

d. 命令模式在开源框架中的应用

在Java的Swing框架中,命令模式被广泛应用。例如,当我们为按钮添加一个操作监听器(ActionListener)时,我们实际上就是在实现命令模式。ActionListener负责监听按钮的点击事件,并执行相应的命令。

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SwingExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Swing Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();

        JButton button = new JButton("Click me!");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Button clicked!");
            }
        });

        panel.add(button);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}

在这个例子中,当我们点击按钮时,按钮的点击事件会被发送给ActionListener,然后ActionListener负责执行相应的命令(在这里是输出一段文字)。

总结

命令模式是一种行为型设计模式,用于将请求封装成对象,实现请求发送者和接收者的解耦。命令模式的优点在于易扩展、支持撤销与恢复操作以及宏命令,但缺点在于可能产生过多的类和导致系统过度设计。在实际开发中,我们可以根据需要灵活地运用命令模式,使得代码更加模块化、易于维护和扩展。

标签:tv,void,模式,命令,TV,十九,public
From: https://blog.51cto.com/u_13616584/6237858

相关文章

  • 二十:解释器模式:语言的力量
    a.探索解释器模式解释器模式是一种行为型设计模式,用于解决特定领域的问题。当一个语言需要解释执行,且可以将该语言中的句子表示为抽象语法树时,就适合使用解释器模式。解释器模式主要包括抽象表达式、终结符表达式和非终结符表达式。b.编写实例:解释器模式实践我们以一个简单的......
  • 每天一个Linux命令-lastlog.
    关于lastlog命令,reportsthemostrecentloginofallusersorofagivenuser可以作为一个审计命令,可以参考笔者的另一篇文章:《关于Linux操作系统使用lastlog命令对OS账号最后一次登录时间的审计》lastlog,是读取的/var/log/lastlog这个data类型的文件,这里主要讲一下关于last......
  • 六:单例模式:独一无二的存在
    a.揭开单例模式的神秘面纱在软件的世界里,我们常常会遇到这样一类对象:它们如同世界上独一无二的宝藏,只存在一个实例。这类对象成为了众多开发者追捧的焦点。为了满足这一特殊需求,设计模式大师们发明了一种叫做“单例模式”的设计。它犹如一种魔法,让某个类的实例永远只有一个。如今......
  • 七:原型模式:克隆的艺术
    a.原型模式的奥秘在一个遥远的星球上,有一个名叫CloneRex的神奇生物。它有一个非凡的能力,那就是可以快速复制自己。它通过这个能力,成功帮助了许多星球的居民解决了他们的燃眉之急。这个故事就像原型模式一样,通过克隆对象,而不是重新创建,实现对象的快速复制。b.动手实践:原型模式的......
  • 十二:桥接模式:独立发展的智慧
    a.桥接模式揭示桥接模式是一种结构型设计模式,它的目的是将抽象与实现分离,使得它们可以独立地变化。通过将实现部分和抽象部分独立开来,我们可以更灵活地实现不同的抽象和实现,从而让它们在独立发展的同时保持低耦合。b.动手编程:桥接模式示例假设我们正在设计一个电子设备商店,商......
  • Windows cmd命令行
    查看当前目录:echo%cd%列出当前目录的所有文件dir跳转到Desktop文件夹:chdirDesktop跳转到当前目录的上一级文件夹chdir..返回home目录chdir%HOMEPATH%创建一个可用于修改的新文件:echo"myawesomefile">my_new_file.txt复制到一个新文件夹copymy_new_file......
  • find命令
    常用的find命令find/path/to/dir-typef-name"*.txt"-print0|xargs-0ls-ltrh#速度快find/path/to/dir-typef-name"*.txt"-execls-ltrh{}\;#速度慢这两个命令看似结果一样,其实有很多区别主要区别是第一个命令是一次性输出,find找到的内容,用null分割,......
  • sys.argv命令行参数使用
    用户命令行配置参数:代码如下:importsysiflen(sys.argv)<2:print('tip:')print('1.select')print('2.select')print('3.select')else:foriinsys.argv[1:]:print(i)......
  • 【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介模板方法模式(TemplateMethodPattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。不同的子类以不同的方式实现这些抽象方法,从而对剩余的逻辑有......
  • docker一些常用命令
    dockerversion:查看Docker版本信息。该命令可以查看当前安装的Docker版本信息,包括Docker引擎、客户端、API等版本。dockerinfo:查看Docker的详细信息。该命令可以查看Docker的详细信息,包括容器、镜像、网络等。dockersearch:搜索DockerHub上的镜像。该命令可以在DockerHub上搜......