设计模式命令模式
设计模式-命令模式" 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