设计模式命令模式

编程

设计模式-命令模式" title="命令模式">命令模式

定义

命令模式是一个高内聚的模式,其定义为:将一个请求封装成一个对象,从而让你使用不同的请求(Command)把客户端参数化,并对请求

排队或者记录请求日志,可以提供命令的撤销或恢复功能。

从定义上有点难理解这个意图,个人觉得这个可以分两块来解读这个模式

第一点:命令的封装以及请求对象与实际执行者(类、模块、系统)的解耦

第二点:命令的执行策略

执行策略往往是根据业务需要扩展内容,命令模式的核心在第一点

uml

  • Command:命令角色
  • Receiver:执行者,命令相关的最终执行动作将会调用一个或多个Receiver去执行业务
  • Invoker:调用者,接收命令,并执行命令

优点

1,类间解耦

调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Command抽象类的execute方法就可以,不需要了解到底

是哪个或哪几个接收者执行

2,可扩展性

Command的子类可以非常容易的扩展,

缺点

如果指令过多,造成类的膨胀过快,不易维护

实现

假设是一个向用户发送消息的需求,目前只有短信和微信消息

public class SmsSendReceiver  {

public void sendMsg(String phone, String msgContent) {

System.out.println("向手机号码 ["+ phone+" ] 发送短信消息:" + msgContent);

}

}

```java

public class WechatSendReceiver {

public void sendMsg(String openId,String msgContent) {

System.out.println("向用户openId [" + openId + "] 发送微信消息:" + msgContent);

}

}

```java

public abstract class AbstractCommand {

protected static final SmsSendReceiver smsReceiver = new SmsSendReceiver();

protected static final WechatSendReceiver wechatReceiver = new WechatSendReceiver();

public abstract void execute();

}

public class SendSmsCommand extends AbstractCommand{

private String msg;

private String phone;

public SendSmsCommand(String phone, String msg) {

this.phone = phone;

this.msg = msg;

}

@Override

public void execute() {

smsReceiver.sendMsg(this.phone, this.msg);

}

}

public class SendWechatCommand extends AbstractCommand {

private String openId;

private String msgContent;

public SendWechatCommand(String openId,String msgContent){

this.openId = openId;

this.msgContent = msgContent;

}

@Override

public void execute() {

wechatReceiver.sendMsg(this.openId, this.msgContent);

}

}

public class SendSmsAndWechatCommand extends AbstractCommand {

private String phone;

private String openId;

private String msgContent;

public SendSmsAndWechatCommand(String phone, String openId, String msgContent) {

this.phone = phone;

this.openId = openId;

this.msgContent = msgContent;

}

@Override

public void execute() {

smsReceiver.sendMsg(this.phone, this.msgContent);

wechatReceiver.sendMsg(this.openId, this.msgContent);

}

}

public class Invoker {

private AbstractCommand command;

public void setCommand(AbstractCommand command){

this.command = command;

}

public void action(){

this.command.execute();

}

}

public class Client {

public static void main(String[] args) {

String phone = "1889999999";

String openId = "ox-2suskgwxs7wqe8232";

String msgContent = "您有一份礼品待领取";

Invoker invoker = new Invoker();

//1,发出发送短信的命令

AbstractCommand smsCommand = new SendSmsCommand(phone, msgContent);

invoker.setCommand(smsCommand);

invoker.action();

//2,发给微信消息的命令

AbstractCommand wechatCommand = new SendWechatCommand(openId, msgContent);

invoker.setCommand(wechatCommand);

invoker.action();

//3,发送短信和微信消息的命令

AbstractCommand smsAndWechatCommand = new SendSmsAndWechatCommand(phone, openId, msgContent);

invoker.setCommand(smsAndWechatCommand);

invoker.action();

}

}

扩展

命令模式结合其他模式会更优秀

命令模式可以结合责任链模式,实现命令族解析任务;结合模板方法模式,则可以减少Command子类的膨胀问题。(后续补充)

使用场景

只要你认为是命令的地方都可以采用。

以上是 设计模式命令模式 的全部内容, 来源链接: utcz.com/z/512026.html

回到顶部