java_command

来源:互联网 发布:抠图软件 for mac 编辑:程序博客网 时间:2024/06/05 16:44

introduction:

命令模式:
将“请求”封转成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式。
在传统的软件系统中,行为请求者和行为实现者之间通常呈现为一种紧耦合,将一组行为抽象为对象,实现二者之间的松耦合。
命令模式的本质:对命令进行封装,将发出命令的责任和执行命令的责任分开。
命令模式的关键:引入抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关。
命令模式的优势:低耦合,易扩充
命令模式的缺点:系统需要过多的命令类,影响命令模式的使用。
命令模式适用环境:
调用者和接收者解耦
支持命令的撤销操作和恢复操作
支持宏命令
命令模式实例:遥控器和电视机

demo:

1.简答命令模式:

description:描述电视机和遥控器场景

Tv.java

public class Tv {    private String name;    public Tv(String name){        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }        public void on(){        System.out.println(name+" on");    }        public void off(){        System.out.println(name+" off");    }}

Command.java

public interface Command {    void execute();}

TvOnCommand.java

public class TvOnCommand implements Command{    private Tv tv;        public TvOnCommand(Tv tv){        this.tv = tv;    }        @Override    public void execute() {        tv.on();    }}

TvOffCommand.java

public class TvOffCommand implements Command{    private Tv tv;        public TvOffCommand(Tv tv){        this.tv = tv;    }        @Override    public void execute() {        tv.off();    }}

NoCommand.java

public class NoCommand implements Command{    @Override    public void execute() {}}
以上实例是一个空对象,当你不想返回一个有意义的对象时,空对象就很有用。客户可以将处理null的责任转移给空对象。


RemoteControl.java

public class RemoteControl {    Command onCommand;    Command offCommand;            public RemoteControl(){        NoCommand noCommand = new NoCommand();        this.onCommand = noCommand;        this.offCommand = noCommand;    }        public void setCommand(Command onCommand, Command offCommand){        this.onCommand = onCommand;        this.offCommand = offCommand;    }        public void onButtonPressed(){       this.onCommand.execute();    }        public void offButtonPressed(){        this.offCommand.execute();    }        @Override    public String toString(){        StringBuffer stringBuffer = new StringBuffer();        stringBuffer.append("--- command begin --- \n");        stringBuffer.append("["+onCommand.getClass().getSimpleName()+","                +offCommand.getClass().getSimpleName()+"]");        stringBuffer.append("\n --- command end ---");        return stringBuffer.toString();    }}

Test.java

public class Test {    public static void main(String[] args) {        Tv tv = new Tv("asarja");                Command tvOn = new TvOnCommand(tv);        Command tvOff = new TvOffCommand(tv);                RemoteControl control = new RemoteControl();                control.setCommand(tvOn, tvOff);                System.out.println(control);        control.onButtonPressed();        control.offButtonPressed();    }}

运行结果:

--- command begin --- 
[TvOnCommand,TvOffCommand]
 --- command end ---
asarja on
asarja off

2.带撤销操作的命令模式(以下未列出的类与1中相同)

Command.java

public interface Command {      void execute();      void undo();  } 

TvOnCommand.java

public class TvOnCommand implements Command{          private Tv tv;            public TvOnCommand(Tv tv){          this.tv = tv;      }            @Override      public void execute() {          tv.on();      }        @Override      public void undo() {          tv.off();      }    }

TvOffCommand.java

public class TvOffCommand implements Command{          private Tv tv;            public TvOffCommand(Tv tv){          this.tv = tv;      }            @Override      public void execute() {          tv.off();      }        @Override      public void undo() {          tv.on();      }    } 

NoCommand.java

public class NoCommand implements Command{          @Override      public void execute() {}        @Override      public void undo() {}    }

RemoteControl.java

public class RemoteControl {      Command onCommand;      Command offCommand;      Command undoCommand;          public RemoteControl(){          NoCommand noCommand = new NoCommand();          this.onCommand = noCommand;          this.offCommand = noCommand;          //初始化的时候 undoCommand 没有        this.undoCommand = noCommand;    }            public void setCommand(Command onCommand, Command offCommand){          this.onCommand = onCommand;          this.offCommand = offCommand;      }            public void onButtonPressed(){         this.onCommand.execute();         this.undoCommand = this.onCommand;    }            public void offButtonPressed(){          this.offCommand.execute();          this.undoCommand = this.offCommand;    }            public void undoButtonPressed(){        this.undoCommand.undo();    }    @Override      public String toString(){          StringBuffer stringBuffer = new StringBuffer();          stringBuffer.append("--- command begin --- \n");          stringBuffer.append("["+onCommand.getClass().getSimpleName()+","                  +offCommand.getClass().getSimpleName()+"]");          stringBuffer.append("\n --- command end ---");          return stringBuffer.toString();      }  }  

Test.java

public class Test {      public static void main(String[] args) {          Tv tv = new Tv("asarja");                    Command tvOn = new TvOnCommand(tv);          Command tvOff = new TvOffCommand(tv);                    RemoteControl control = new RemoteControl();                    control.setCommand(tvOn, tvOff);                    System.out.println(control);          control.onButtonPressed();          control.offButtonPressed();          control.undoButtonPressed();    }  } 

运行结果:

--- command begin --- 
[TvOnCommand,TvOffCommand]
 --- command end ---
asarja on
asarja off
asarja on

原创粉丝点击