合水网站建设,wordpress shift+enter,东莞网站制作的公司,网站域名所有权证明命令模式
1.命令模式含义
命令模式#xff0c;将一个请求封装为一个对象#xff0c;从而使你可用不同的请求对客户进行参数化。对请求排队或记录请求日志#xff0c;以及支持可撤销的操作。
命令模式乍一看#xff0c;有点懵懵的。即使这个定义看完#xff0c;也是不明…命令模式
1.命令模式含义
命令模式将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化。对请求排队或记录请求日志以及支持可撤销的操作。
命令模式乍一看有点懵懵的。即使这个定义看完也是不明所以。但是结合例子来讲的话就比较容易理解了。
其实它就是把一个类能做的事情使用具体的对象Command类来包装一下当客户端想调用某个方法的时候他需要通过具体的Command类来进行调用而不能直接实例化那个类然后调用类方法。这样的话就将类的调用和调用请求的发出者给相互隔离开解耦了。这样具体的请求执行者就不需要关注到底是谁发出的这个请求执行命令只需要把要执行的命令执行完即可。
比如现在路边有一个三轮车的烧烤摊烧烤摊只有一个老板负责点单、收款、烤肉、分发烤好的肉这些事情。那么这个老板其实就是行为实现者然后买烧烤的客人就是行为请求者。在这种情况下作为行为实现者的老板承担的事情职责就非常多客户与老板紧耦合了老板要处理的事情很多就非常容易出错混乱。
而如果换一种方式烧烤摊的老板赚到钱了不再使用三轮车了直接租了一个店面招了一个服务员来帮忙。这下客人来吃烧烤的时候就不用老板来负责点单、收款、分发烤肉的事情了这些事情交给服务员来干当客户需要烧烤的时候只需要由服务员告诉老板需要几串羊肉串、几串五花肉即可老板不需要知道这些烤串是哪个客户要的他只需要把这些烤串烤完交给服务员就行。这样老板和顾客就是松耦合了老板只需要接收服务员的命令即可有序、高效的完成烧烤订单。
这个行为请求者与行为实现者实现解耦的过程其实就是命令模式了。它将客人的请求封装对象由服务员统一接收服务员接收完这些命令对象后将命令对象转达给老板老板统一执行这些命令老板不需要关心谁发出的命令请求直接执行完命令即可这样就不会出现手忙脚乱的问题了。
2.代码示例
下面以烧烤为例展示一下命令模式的代码
2.1Receiver类
Receiver类是命令接受者对象定义了命令接受者可以做的事情
public class Receiver {public void bakeMutton(){System.out.println(烤羊肉);}public void bakeBeef(){System.out.println(烤牛肉);}public void bakeBread(){System.out.println(烤面包);}public void bakeLobster(){System.out.println(烤小龙虾);}
}2.2Command类
Command类是命令抽象类定义了一个命令接受者对象以及命令执行的抽象方法
public abstract class Command {protected Receiver receiver;public Command(Receiver receiver) {this.receiver receiver;}public abstract void execute();
}2.3BakeBeefCommand类
BakeBeefCommand烤牛肉类是Command类的具体子类实现
public class BakeMuttonCommand extends Command{public BakeMuttonCommand(Receiver receiver) {super(receiver);}Overridepublic void execute() {receiver.bakeMutton();}
}2.4BakeBreadCommand类
BakeBreadCommand烤面包类是Command类的具体子类实现
public class BakeBreadCommand extends Command{public BakeBreadCommand(Receiver receiver) {super(receiver);}Overridepublic void execute() {receiver.bakeBread();}
}2.5BakeLobsterCommand类
BakeLobsterCommand烤小龙虾类是Command的具体子类实现
public class BakeLobsterCommand extends Command{public BakeLobsterCommand(Receiver receiver) {super(receiver);}Overridepublic void execute() {receiver.bakeLobster();}
}2.6BakeMuttonCommand类
BakeMuttonCommand烤羊肉串类是Command的具体子类实现
public class BakeMuttonCommand extends Command{public BakeMuttonCommand(Receiver receiver) {super(receiver);}Overridepublic void execute() {receiver.bakeMutton();}
}2.7Invoker类
Invoker类是具体命令的接收者用于接收客户的所有命令然后将命令转达给执行者执行这些命令
public class Invoker {private ListCommand command new ArrayList();public void setCommand(Command command) {this.command.add(command);}public void executeCommand(){for (Command comm : command) {comm.execute();}}
}2.8测试类
public class MainApp {public static void main(String[] args) {Receiver receiver new Receiver();Command command new BakeMuttonCommand(receiver);Command breadCommand new BakeBreadCommand(receiver);Command lobsterCommand new BakeLobsterCommand(receiver);Invoker invoker new Invoker();invoker.setCommand(command);invoker.setCommand(breadCommand);invoker.setCommand(lobsterCommand);invoker.executeCommand();}
}运行结果 烤羊肉 烤面包 烤小龙虾 3.命令模式优点
能够比较容易的设计一个命令队列在需要的情况下可以比较容易地将命令记入日志允许接收请求的一方决定是否要解决请求可以容易的实现对请求的撤销和重做容易扩展新的命令类能够把请求一个操作的对象与知道怎么执行一个操作的对象分隔开
4.总结
命令模式能够实现将请求发出者和请求执行者进行解耦便于实现请求的撤销、重做等操作。但是命令模式并不是一旦碰到类似情况的时候就要使用而是要在确定需要使用的时候再使用不要在自己猜测的基础上给系统增加不必要的功能不能为了用命令模式而用命令模式这点要考虑清楚。
这篇命令模式感觉写的有点模模糊糊的大家可以多看两遍示例代码理解一下。