设计模式-命令模式

1、概述

命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,从而使得不同的请求可以用参数化的形式传递和处理。通过引入命令对象,命令模式将请求的发送者和接收者解耦,实现了请求队列、日志记录、撤销操作等功能,增强了系统的灵活性和可扩展性。命令模式非常适用于需要执行操作记录、撤销、重做和支持事务管理的场景。

Command:声明执行操作的接口。

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

Client:创建一个具体命令对象并确定其接收者。

Invoker:要求该命令执行这个请求。

Receiver:知道如何实施与执行一个请求相关的操作。

2、优缺点

3、实现方式


public class Test {

    public static void main(String[] args) {
        // 创建接收者对象
        FileSystemReceiver fs = new UnixFileSystemReceiver();

        // 创建具体命令并指定接收者
        OpenCommand openCommand = new OpenCommand(fs);
        CloseCommand closeCommand = new CloseCommand(fs);
        WriteCommand writeCommand = new WriteCommand(fs);

        // 创建调用者并执行命令
        FileInvoker file = new FileInvoker(openCommand);
        file.execute();

        file = new FileInvoker(writeCommand);
        file.execute();

        file = new FileInvoker(closeCommand);
        file.execute();
    }
}

public interface Command {
    void execute();
}

// 打开命令
public class OpenCommand implements Command {
    private FileSystemReceiver fileSystem;

    public OpenCommand(FileSystemReceiver fs) {
        this.fileSystem = fs;
    }

    @Override
    public void execute() {
        this.fileSystem.openFile();
    }
}

// 关闭命令
public class CloseCommand implements Command {
    private FileSystemReceiver fileSystem;

    public CloseCommand(FileSystemReceiver fs) {
        this.fileSystem = fs;
    }

    @Override
    public void execute() {
        this.fileSystem.closeFile();
    }
}

// 写命令
public class WriteCommand implements Command {
    private FileSystemReceiver fileSystem;

    public WriteCommand(FileSystemReceiver fs) {
        this.fileSystem = fs;
    }

    @Override
    public void execute() {
        this.fileSystem.writeFile();
    }
}


public interface FileSystemReceiver {
    void openFile();
    void writeFile();
    void closeFile();
}

public class UnixFileSystemReceiver implements FileSystemReceiver {

    @Override
    public void openFile() {
        System.out.println("Opening file in unix OS");
    }

    @Override
    public void writeFile() {
        System.out.println("Writing file in unix OS");
    }

    @Override
    public void closeFile() {
        System.out.println("Closing file in unix OS");
    }
}

public class WindowsFileSystemReceiver implements FileSystemReceiver {

    @Override
    public void openFile() {
        System.out.println("Opening file in Windows OS");
    }

    @Override
    public void writeFile() {
        System.out.println("Writing file in Windows OS");
    }

    @Override
    public void closeFile() {
        System.out.println("Closing file in Windows OS");
    }
}

public class FileInvoker {
    public Command command;

    public FileInvoker(Command command) {
        this.command = command;
    }

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

4、应用场景

智能家居系统:可以将对不同设备(如灯、空调、电视等)的操作封装为命令对象,通过遥控器或智能控制中心来调用这些命令。

事务管理系统:在数据库操作中,可以将每个数据库操作(如插入、更新、删除)封装为命令对象,以便于事务的回滚和重做。

文本编辑器:将每个编辑操作(如输入、删除、复制、粘贴)封装为命令对象,可以实现撤销和重做功能。

任务队列系统:可以将每个任务封装为命令对象,并将这些命令对象放入队列中,以便于按顺序执行或分布式处理。

This entry was posted in 应用, 设计模式. Bookmark the permalink.