【Java设计模式】命令模式

【Java设计模式】命令模式,第1张

文章目录
    • 命令模式的四个角色
    • 命令模式的类图
    • 命令模式的例子
    • 命令模式优点
    • 命令模式适用场景

命令模式:将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的 *** 作

命令模式的四个角色

四种角色:接收者(Receiver),命令(Command)接口,具体命令(ConcreteCommand),请求者(Invoker)

命令模式的类图

命令模式的例子

实例:
在军队作战中,指挥官请求三连偷袭敌人,但是指挥官不希望或无法直接与三连取得联系,那么可以将该请求:“三连偷袭敌人”形成一个“作战命令”。只要能让该作战命令被执行,就会实现三连偷袭敌人的目的。

1.接收者(Receiver) : CompanyArmy.java

public class CompanyArmy{
   public void sneakAttack(){ 
  System.out.println("我们知道如何偷袭敌人,保证完成任务"); 
   }
}

2.命令(Command)接口 : Command.java

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

3.具体命令(ConcreteCommand)ConcreteCommand.java

public class ConcreteCommand implements Command{
   CompanyArmy army; //含有接收者的引用
   ConcreteCommand(CompanyArmy army){
      this.army=army;}
   public  void execute(){ //封装着指挥官的请求
      army.sneakAttack();  //偷袭敌人  
   }
}

4.请求者(Invoker) ArmySuperior.java

public class ArmySuperior{
  Command command;  //用来存放具体命令的引用
  public void setCommand(Command command){
     this.command=command;}
  public void startExecuteCommand(){ 
    //让具体命令执行execute()方法
     command.execute();}}

5.应用 Application.java

 public class Application{
   public static void main(String args[]){
      CompanyArmy 三连=new CompanyArmy();         
      Command command=new ConcreteCommand(三连);
      ArmySuperior 指挥官=new ArmySuperior();     
      指挥官.setCommand(command);                 
      指挥官.startExecuteCommand();}}

练习:
模拟带控制开关的小电器。该电器上有四个开关,两个一组,其中一组负责打开、关闭小电器上的照明灯,另一组负责打开、关闭小电器上的摄像头。

1.接收者

public class Light {
    public void on(){
    	System.out.println("灯打开了");
    }
    public void off(){
    	System.out.println("灯关闭了");
    }
}
public class Camera {
    public void on(){
    	System.out.println("摄像头打开了");
    }
    public void off(){
    	System.out.println("摄像头关闭了");
    }
}

2.命令接口

public interface Command {

    public abstract void execute();

    public String getName();

}

3.具体命令


public class OffCameraCommand implements shiyan1.Command {
    Camera camera;

    public OffCameraCommand(Camera camera){
    	this.camera=camera;
    }

    public void execute(){
    	camera.off();
    }

    public String getName(){
        return "关摄像头";
    }

}
public class OnCameraCommand implements shiyan1.Command {
    Camera camera;

    public OnCameraCommand(Camera camera){
    	this.camera=camera;
    }

    public void execute(){
    	camera.on();
    }

    public String getName(){
        return "开摄像头";
    }

}
public class OffLightCommand implements shiyan1.Command {
    Light light;

    public OffLightCommand(Light light){
    	this.light=light;
    }

    public void execute(){
    	light.off();
    }

    public String getName(){
        return "关灯";
    }

}

public class OnLightCommand implements shiyan1.Command {
    Light light;

    public OnLightCommand(Light light){
    	this.light=light;
    }

    public void execute(){
    	light.on();
    }

    public String getName(){
        return "开灯";
    }

}

4.请求者

public class invoker {
    Command command;

    public void setCommand(Command command){
    	this.command=command;
    	this.executeCommand();
    }

    private void executeCommand(){
    	command.execute();
    }

}

5.实现

public class Application {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Light light=new Light();
		Camera camera=new Camera();
		invoker invoker=new invoker();
		//开灯
		Command command1=new OnLightCommand(light);
		invoker.setCommand(command1);
		//关灯
		Command command2=new OffLightCommand(light);
		invoker.setCommand(command2);
		//开摄像头
		Command command3=new OnCameraCommand(camera);
		invoker.setCommand(command3);
		//关摄像头
		Command command4=new OffCameraCommand(camera);
		invoker.setCommand(command4);

	}

}

6.运行结果

命令模式优点

1、在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含接收者(Receiver)的引用,因此彻底消除了彼此之间的耦合。
2、命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接受者,不必修改调用者的代码,调用者就可以使用新的命令对象;反之,如果增加新的调用者,不必修改现有的具体命令和接受者,新增加的调用者就可以使用已有的具体命令。
3、由于请求者的请求被封装到了具体命令中,那么就可以将具体命令保存到持久化的媒介中,在需要的时候,重新执行这个具体命令。因此,使用命令模式可以记录日志。
4、使用命令模式可以对请求者的“请求”进行排队。每个请求都各自对应一个具体命令,因此可以按一定顺序执行这些具体命令。

命令模式适用场景

程序需要在不同的时刻指定、排列和执行请求;
程序需要提供撤销 *** 作;
程序需要支持宏 *** 作。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/795540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存