java设计模式-Command模式

1.背景:                  

站在MM的角度,想命令追求者Boy干什么就干什么,而且将来还可以扩展,怎么做?
 
2.代码:                  
Command.java:
package com.cy.dp.command;

public abstract class Command {
    
    public abstract void execute();        //执行命令
    public abstract void undo();        //取消执行命令
    
}

Command的实现类ShoppingCommand:(逛街命令)

package com.cy.dp.command;

public class ShoppingCommand extends Command {

    @Override
    public void execute() {
        System.out.println("zoo");
    }

    @Override
    public void undo() {
        System.out.println("undo zoo");
    }

}
View Code

Command的实现类HugCommand:(拥抱命令)

package com.cy.dp.command;

public class HugCommand extends Command{

    @Override
    public void execute() {
        System.out.println("hug");
    }

    @Override
    public void undo() {
        System.out.println("open your arms");
    }

}
View Code

Boy.java:

package com.cy.dp.command;

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

public class Boy {
    private String name;
    private List<Command> commands = new ArrayList<Command>();
    //private List<Command> doCommands;        装的是已经执行过的command,用于undo
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public void pursue(MM mm){
    }
    
    public void executeCommands(){
        for(Command c : commands){
            c.execute();
        }
    }
    public void undoCommands(){
        //循环doCommands来undo
        //用栈来操作,最后执行的操作先undo
    }
    
    
    public void addCommand(Command c){
        this.commands.add(c);
    }
    
}

MM.java:

package com.cy.dp.command;

public class MM {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    //MM命令Boy做什么
    public void order(Boy b){
        Command c1 = new ShoppingCommand();
        Command c2 = new HugCommand();
        b.addCommand(c1);
        b.addCommand(c2);
        b.executeCommands();
    }
}
原文地址:https://www.cnblogs.com/tenWood/p/9136659.html