命令行模式
将行为的执行与与行为的调用通过命令分离,行为的的调用者不需要知道具体是哪个类执行的,他们之间通过命令连接。
demo的目录结构
命令的执行者(接口)
package behavioralpattern.commandpattern.actuator;import java.math.BigDecimal;/*** @author tx* @version 1.0* @date 2024/1/15 16:12* @description:* 命令的执行者*/
public interface Actuator {BigDecimal act(BigDecimal x,BigDecimal y);
}
命令的执行者(实现)
package behavioralpattern.commandpattern.actuator;import java.math.BigDecimal;/*** @author tx* @version 1.0* @date 2024/1/15 16:17* @description: 加法执行器*/
public class Add implements Actuator{@Overridepublic BigDecimal act(BigDecimal x, BigDecimal y) {return x.add(y);}
}
命令的抽象层
package behavioralpattern.commandpattern.command;import behavioralpattern.commandpattern.actuator.Actuator;
import behavioralpattern.commandpattern.actuator.Add;import java.math.BigDecimal;/*** @author tx* @version 1.0* @date 2024/1/15 16:07* @description:* 命令的抽象*/
public abstract class Command {private final Actuator actuator;public Command() {// 初始化一个具体的执行器actuator = setActuator();}// 交给子类确定是什么执行器protected abstract Actuator setActuator();/*** 命令执行,command本身不进行具体的操作* @param x 第一个参数* @param y 第二个参数* @return 返回的执行结果*/public BigDecimal execute(BigDecimal x,BigDecimal y){return actuator.act(x,y);}
}
命令的实现
package behavioralpattern.commandpattern.command;import behavioralpattern.commandpattern.actuator.Actuator;
import behavioralpattern.commandpattern.actuator.Add;/*** @author tx* @version 1.0* @date 2024/1/15 16:09* @description:* 加法命令*/
public class AddC extends Command{@Overrideprotected Actuator setActuator() {return new Add();}
}
客户端&调用者
package behavioralpattern.commandpattern;import behavioralpattern.commandpattern.command.*;import java.math.BigDecimal;/*** @author tx* @version 1.0* @date 2024/1/14 19:23* @description:* 命令模式**/
public class CommandPattern {public static void main(String[] args) {// 创建一个命令发起者Invoker invoker = new Invoker();// 创建几个命令Command addC = new AddC();Command subC = new SubC();Command mulC = new MulC();Command divC = new DivC();// 定义2个数String x = "100";String y = "10";System.out.printf("x:%s,y:%s\n",x,y);// 执行加法invoker.setCommand(new AddC());BigDecimal bigDecimal = invoker.execCommand(x, y);System.out.println("加法执行结果:"+bigDecimal);// 执行除法invoker.setCommand(new DivC());BigDecimal bigDecimal1 = invoker.execCommand(x, y);System.out.println("除法执行结果:"+bigDecimal1);}
}
// 命令发起者
class Invoker{private Command command;public void setCommand(Command command) {this.command = command;}public BigDecimal execCommand(String x, String y){return command.execute(new BigDecimal(x),new BigDecimal(y));}
}
对于调用者来说,命令的具体执行者是不可见的,他接触到的是一个个命令,命令和命令的执行者都可以非常方便的扩展。完整代码见 gitee