23种设计模式-java-命令

本文通过一个代码实例展示了如何利用命令模式在文本编辑器中实现插入、删除文本的操作,并提供了撤销功能。命令模式允许将请求封装为独立的对象,便于参数化、队列处理和撤销操作。在编辑器类中,插入和删除命令被创建并执行,同时历史命令存储在栈中,用于执行撤销操作。

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

模式概述:

它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。

使用场景:

1.如果你需要通过操作来参数化对象, 可使用命令模式。
2.如果你想要将操作放入队列中、 操作的执行或者远程执行操作, 可使用命令模式。
3.如果你想要实现操作回滚功能, 可使用命令模式。

代码样例:

代码背景: 对文本编辑器的内容进行插入和删除一段文本等相关操作,通过命令模式来进行实现,并实现撤销功能。

/**
 * 编辑器
 */
public class Editor {
    private String text;//编辑器内容
    private Stack<Command> hisCommands = new Stack<>();

    public Editor(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }

    public Stack<Command> getHisCommands() {
        return hisCommands;
    }

    public void setHisCommands(Stack<Command> hisCommands) {
        this.hisCommands = hisCommands;
    }




    //将客户端的请求封装成对象(命令对象);即把函数封装成对象,封装成对象之后,对象就可以存储下来,
    //方便控制执行,从而可以实现队列执行、日志记录、撤销等功能

    /**
     * 向文本编辑器中插入内容
     */
    public void insertSomeText(String insertText){
        Command command = new InsertCommand(insertText);
        command.doIt(this);
    }

    /**
     * 删除文本编辑器内容的前2个字
     */
    public void deleteSomeText(){
        Command command = new DeleteCommand();
        command.doIt(this);
    }

    /**
     * 返回操作
     */
    public void back(){
        if(!hisCommands.isEmpty()){
            hisCommands.pop().unDo(this);
        }
    }
/**
 * 命令接口
 */
public interface Command {

    void doIt(Editor editor);
    void unDo(Editor editor);//根据实际的业务逻辑,实现doIt对应的返回操作
}
/**
 * 插入命令
 */
public class InsertCommand implements Command{
    private String insertText;
    private String backText;

    public InsertCommand(String insertText) {
        this.insertText = insertText;
    }

    @Override
    public void doIt(Editor editor) {
        editor.setText(insertText+editor.getText());
        this.backText = insertText;
        editor.getHisCommands().push(this);
    }

    @Override
    public void unDo(Editor editor) {
        editor.setText(editor.getText().substring(backText.length()));
    }
}
/**
 * 删除命令
 */
public class DeleteCommand implements Command{
    private String backText;
    @Override
    public void doIt(Editor editor) {
        this.backText = editor.getText().substring(0,2);
        editor.setText(editor.getText().substring(2));
        editor.getHisCommands().push(this);
    }

    @Override
    public void unDo(Editor editor) {
        editor.setText(backText + editor.getText());
    }
}
/**
 * 测试命令模式
 */
public class TestCommand {
    public static void main(String[] args) {
        Editor editor  = new Editor("abcd");
        System.out.println("编辑器初始内容为:"+editor.getText());

        editor.insertSomeText("456");
        System.out.println("编辑器执行一次插入操作后:"+editor.getText());

        editor.insertSomeText("123");
        System.out.println("编辑器执行两次插入操作后:"+editor.getText());

        editor.deleteSomeText();
        System.out.println("编辑器执行一次删除操作后:"+editor.getText());

        editor.back();
        System.out.println("编辑器执行一次撤销后:"+editor.getText());

        editor.back();
        System.out.println("编辑器执行两次撤销后:"+editor.getText());
        
        editor.back();
        System.out.println("编辑器执行三次撤销后:"+editor.getText());
    }
}

测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值