设计模式之命令模式

设计模式之命令模式

将请求封装为对象,以便于使用不同的请求、队列或者日志来参数化其他对象

其中有请求的发出者、请求的调用者、封装的请求对象、请求接收者

  1. 请求的发出者 Client
  2. 请求的调用者 Invoker
  3. 命令接口 Command
  4. 命令实现类 ConcreteCommand
  5. 请求接收者 Receiver

设计模式之命令模式_第1张图片

设计一个命令模式 将灯的开关请求封装

首先创建一个请求接收者Receiver 它是任务完成的基础,是对请求做出回应的对象

public class Light {
     
    public void lightOn(){
     
        System.out.println("开启灯...");
    }
    public void lightOff(){
     
        System.out.println("关闭灯...");
    }
}

多种命令通过接口来进行统一管理

创建command接口

public interface Command {
     
    public void excute();
}

创建灯的开、关请求并实现此接口

此时是将请求封装成了命令

public class LightOnCommand implements Command {
     
    Light light;
    public LightOnCommand(Light light){
     
        this.light=light;
    }
    @Override
    public void excute() {
     
        light.lightOn();

    }
}
public class LightOffCommand implements Command {
     
    Light light;
    public LightOffCommand(Light light){
     
        this.light =light;
    }
    @Override
    public void excute() {
     
        light.lightOff();
    }
}

请求创建完毕接下来就是命令的调用者invoker

获得命令

调用excute()来发出请求

public class CommandInvoker {
     
    private static Light light =new Light();
     private static Command command;

    public static void setCommand(Command command1){
     
        command =command1;
    }
    public static void pressButton(){
     
        command.excute();
    }
}

最后实现命令的发起者

public class CommandClient {
     
    public static void main(String[] args) {
     
        //开启灯
        Light light = new Light();
        Command command1 =new LightOnCommand(light);
        CommandInvoker.setCommand(command1);
        CommandInvoker.pressButton();
        //关闭灯
        Command command2 =new LightOffCommand(light);
        CommandInvoker.setCommand(command2);
        CommandInvoker.pressButton();
    }
}

在这个模式里

  1. 发出请求的对象Client与执行请求的对象Invoker解耦
  2. 两者之间通过命令Command进行沟通
  3. Command将接收者Receiver和接收者的动作包进对象中,且只暴露一个excute方法
  4. 请求调用者Invoker只需要调用Command的excute方法就可以实现目的
  5. 命令的发起者 Client定义是哪个命令
  6. 命令的执行者 Invoker 执行命令的excute方法

文档仅是个人总结,如有错误希望大家可以不吝赐教

你可能感兴趣的:(设计模式,设计模式,java)