java sendcommand_命令模式-Command(Java实现)

命令模式-Command

将一个命令请求封装为一个对象, 这样就可以使用命令来修改目标对象的相关参数了.

本文的例子是, 狗主人(Master) 希望对狗狗发一些命令, 狗来进行响应, 以达到修改"参数"的作用.

比如, 发出让狗狗坐下, 吐舌头 等命令后...狗狗的参数就从站着变为了坐着, 从没伸出舌头变为了吐出舌头.

HandState枚举

public enum HandState {

REACH("伸出爪子"), BACK("没伸出爪子");

private String handState;

HandState(String handState) {

this.handState = handState;

}

@Override

public String toString() {

return handState;

}

}

PostureState枚举

public enum PostureState {

SITTING("坐着"), STANDING("站着");

private String posture;

PostureState(String posture) {

this.posture = posture;

}

@Override

public String toString() {

return posture;

}

}

TongueState枚举

public enum TongueState {

SPIT("吐出舌头"), BACK("没伸出舌头");

private String tongueState;

TongueState(String tongueState) {

this.tongueState = tongueState;

}

@Override

public String toString() {

return tongueState;

}

}

Command接口

命令的抽象定义.

public interface Command {

/**

* 对dog执行命令

*/

void execute(Dog dog);

/**

* 再来一遍刚刚那次execute(dog)

*/

void undo();

/**

* 撤销刚刚那次execute(dog)

*/

void redo();

@Override

String toString();

}

HandStateCommand类

握手命令

public class HandStateCommand implements Command {

private Dog dog;

@Override

public void execute(Dog dog) {

dog.setHandState(HandState.REACH);

this.dog = dog;

}

@Override

public void undo() {

if (dog != null) {

dog.setHandState(HandState.BACK);

}

}

@Override

public void redo() {

if (dog != null) {

dog.setHandState(HandState.REACH);

}

}

@Override

public String toString() {

return "让狗伸出爪子的命令";

}

}

PostureStateCommand类

站立/坐下姿势命令.

public class PostureStateCommand implements Command {

private Dog dog;

@Override

public void execute(Dog dog) {

dog.setPostureState(PostureState.SITTING);

this.dog = dog;

}

@Override

public void undo() {

if (dog != null) {

dog.setPostureState(PostureState.STANDING);

}

}

@Override

public void redo() {

if (dog != null) {

dog.setPostureState(PostureState.SITTING);

}

}

@Override

public String toString() {

return "让狗坐下的命令";

}

}

TongueStateCommand类

伸舌头/合上嘴 命令

public class TongueStateCommand implements Command {

private Dog dog;

@Override

public void execute(Dog dog) {

dog.setTongueState(TongueState.SPIT);

this.dog = dog;

}

@Override

public void undo() {

if (dog != null) {

dog.setTongueState(TongueState.BACK);

}

}

@Override

public void redo() {

if (dog != null) {

dog.setTongueState(TongueState.SPIT);

}

}

@Override

public String toString() {

return "让狗吐出舌头的命令";

}

}

Dog类

被命令的对象, 根据命令会改变Dog类的状态.

public class Dog {

private HandState handState;

private PostureState postureState;

private TongueState tongueState;

{

handState = HandState.BACK;

postureState = PostureState.STANDING;

tongueState = TongueState.BACK;

}

public void setHandState(HandState handState) {

this.handState = handState;

}

public void setPostureState(PostureState postureState) {

this.postureState = postureState;

}

public void setTongueState(TongueState tongueState) {

this.tongueState = tongueState;

}

@Override

public String toString() {

return "Dog{" +

"handState=" + handState +

", postureState=" + postureState +

", tongueState=" + tongueState +

'}';

}

public void printStatus() {

System.out.println(this);

}

}

Master类

由Master来施加命令来对Dog进行一些参数上的改变.

import java.util.Deque;

import java.util.LinkedList;

public class Master {

private Deque undoStack = new LinkedList<>();

private Command redo ;

public Master() {

}

public void sendCommand(Command command, Dog dog) {

System.out.printf("主人使用命令:\n", command);

command.execute(dog);

redo = command;

undoStack.offerLast(command);

}

public void undoLastCommand() {

if (!undoStack.isEmpty()) {

Command previousSpell = undoStack.pollLast();

redo = previousSpell;

System.out.printf("主人撤回命令:\n", previousSpell);

previousSpell.undo();

}

}

public void redoLastCommand() {

if (redo!=null) {

undoStack.offerLast(redo);

System.out.printf("再一次执行了命令:\n", redo);

redo.redo();

}

}

@Override

public String toString() {

return "狗的主人";

}

}

Main

运行程序/ 场景模拟

public class Main {

public static void main(String[] args) {

Master master = new Master();

Dog dog = new Dog();

dog.printStatus();

//开始命令狗, 站姿坐姿

master.sendCommand(new PostureStateCommand(), dog);

dog.printStatus();

// 开始命令狗, 吐舌头

master.sendCommand(new TongueStateCommand(), dog);

dog.printStatus();

master.redoLastCommand();

dog.printStatus();

master.undoLastCommand();

dog.printStatus();

master.redoLastCommand();

dog.printStatus();

master.undoLastCommand();

dog.printStatus();

// 开始命令狗, 伸爪子

master.sendCommand(new HandStateCommand(), dog);

dog.printStatus();

master.redoLastCommand();

dog.printStatus();

master.undoLastCommand();

dog.printStatus();

}

}

运行结果如下:

b42505745ba29717b65e15aead2d86cc.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的实现: 首先,需要定义命令接口`Command`,其中包含一个`execute()`方法: ```java public interface Command { void execute(); } ``` 接下来,定义两个具体的命令类`SendLetterCommand`和`DeliverLetterCommand`,分别代表发送信件和投递信件的操作。这两个类都需要实现`Command`接口的`execute()`方法: ```java public class SendLetterCommand implements Command { private PostOffice postOffice; private String letter; public SendLetterCommand(PostOffice postOffice, String letter) { this.postOffice = postOffice; this.letter = letter; } @Override public void execute() { postOffice.sendLetter(letter); } } public class DeliverLetterCommand implements Command { private Postman postman; private String address; public DeliverLetterCommand(Postman postman, String address) { this.postman = postman; this.address = address; } @Override public void execute() { postman.deliverLetter(address); } } ``` 其中,`SendLetterCommand`包含一个邮局对象和一个信件内容,`DeliverLetterCommand`包含一个邮递员对象和一个收件人地址。 接着,定义邮局类`PostOffice`和邮递员类`Postman`,分别实现发送信件和投递信件的具体操作: ```java public class PostOffice { public void sendLetter(String letter) { System.out.println("发送信件:" + letter); } } public class Postman { public void deliverLetter(String address) { System.out.println("投递信件至:" + address); } } ``` 最后,定义一个命令调用类`CommandInvoker`,其中包含一个`execute(Command command)`方法,用于执行命令: ```java public class CommandInvoker { public void execute(Command command) { command.execute(); } } ``` 使用时,可以先创建一个邮局对象和一个邮递员对象,然后根据需要创建`SendLetterCommand`和`DeliverLetterCommand`对象,并将它们作为参数传递给`CommandInvoker`的`execute()`方法,即可模拟邮局送信的过程: ```java public class Main { public static void main(String[] args) { PostOffice postOffice = new PostOffice(); Postman postman = new Postman(); CommandInvoker invoker = new CommandInvoker(); Command sendCommand = new SendLetterCommand(postOffice, "Hello, world!"); Command deliverCommand = new DeliverLetterCommand(postman, "123 Main Street"); invoker.execute(sendCommand); invoker.execute(deliverCommand); } } ``` 输出结果为: ``` 发送信件:Hello, world! 投递信件至:123 Main Street ``` 这就是一个简单的命令模式模拟邮局送信的实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值