栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Java设计模式】命令模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Java设计模式】命令模式

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

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

命令模式的四个角色

四种角色:接收者(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、使用命令模式可以对请求者的“请求”进行排队。每个请求都各自对应一个具体命令,因此可以按一定顺序执行这些具体命令。

命令模式适用场景

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/846643.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号