java_command

6603 ワード

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 --- 
"); stringBuffer.append("["+onCommand.getClass().getSimpleName()+"," +offCommand.getClass().getSimpleName()+"]"); stringBuffer.append("
--- 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 --- 
"); stringBuffer.append("["+onCommand.getClass().getSimpleName()+"," +offCommand.getClass().getSimpleName()+"]"); stringBuffer.append("
--- 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