封装命令

代码结构
Java设计模式:命令模式_java
源码

package com.myspringboot.shejimoshi.mingling;

public abstract class Command {
    public abstract void todo();
    public abstract void undo();
}
package com.myspringboot.shejimoshi.mingling;

public class Content {
    String msg = "hello everybody ";
}
package com.myspringboot.shejimoshi.mingling;

public class CopyCommand extends Command {
    Content c;
    public CopyCommand(Content c) {
        this.c = c;
    }

    @Override
    public void todo() {
        c.msg = c.msg + c.msg;
    }

    @Override
    public void undo() {
        c.msg = c.msg.substring(0, c.msg.length()/2);
    }
}
package com.myspringboot.shejimoshi.mingling;

public class DeleteCommand extends Command {
    Content c;
    String deleted;
    public DeleteCommand(Content c) {
        this.c = c;
    }

    @Override
    public void todo() {
        deleted = c.msg.substring(0, 5);
        c.msg = c.msg.substring(5, c.msg.length());
    }

    @Override
    public void undo() {
        c.msg = deleted + c.msg;
    }
}
package com.myspringboot.shejimoshi.mingling;

public class InsertCommand extends Command {
    Content c;
    String strToInsert = "go";
    public InsertCommand(Content c) {
        this.c = c;
    }

    @Override
    public void todo() {
        c.msg = c.msg + strToInsert;
    }

    @Override
    public void undo() {
        c.msg = c.msg.substring(0, c.msg.length()-strToInsert.length());
    }
}
package com.myspringboot.shejimoshi.mingling;

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        Content c = new Content();

        List<Command> commands = new ArrayList<>();
        commands.add(new InsertCommand(c));
        commands.add(new CopyCommand(c));
        commands.add(new DeleteCommand(c));

        for (Command comm : commands) {
            comm.todo();
        }

        System.out.println(c.msg);

        for (int i = commands.size() - 1; i >= 0; i--) {
            commands.get(i).undo();
        }

        System.out.println(c.msg);
    }
}