命令模式
命令模式(Command):将请求封装成一个对象,从而使你可以用不同的请求对客户客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
同样的讲一样烤羊肉串的案例,不过说到烤羊肉串不知道你们今天中午有没有玩芝士超人,答到第十题惜败啊!离平分二十万奖金只差一点点。
记得第五题是致癌物含量最高的是A火锅B炸鸡C烤羊肉串。毫无疑问答案就是羊肉串了,想必大家都爱吃,不过为了身体着想还是少吃吧!
回归话题,大家肯定都有街边撸串的经历,你选择一些串串后直接交给老板烤,然后我们就看下代码实现
Class Barbecuer{
Public void barbecue{
System.out.println(“开始烧烤”);
}
}
Piblic class Client{
Public static void main(String[] args){
Barbecuer bbq=new Barbecuer();
Bbq.barbecue();
}
}
这就是简单的路边撸串 客户告诉老板要什么串老板开始烤。
但是问题就来了:
- 其一在代码里面这样耦合度太高。
- 其二当你觉得吃不下,或者不想要的时候,老板已经开始烤了已经不能更改了。
有什么解决办法呢?
对,就是餐厅模式,你不跟真正烤的人讲要求,而是把要吃的串串咸辣等要求都告诉服务员,然后服务员把这一连串的需求给后厨。
画成简图就是:
然后我们用代码实现下:
//首先是服务员
class waiter{
//需求命令
private Command command;
//接收需求命令
public void setCommand(Command command){
this.command=command;
}
//传递命令
public void notifya(){
command.toExecute();
}
}
//然后是抽象的需求(命令)
abstract class Command{
//持有将要传递的目标
protected Barbecuer barbecuer;
public Command(Barbecuer barbecuer){
this.barbecuer= barbecuer;
}
//给目标执行
public void toExecute(){
barbecuer.execute();
}
}
//实际需求(命令)
class shashlikCommand extends Command{
public shashlikCommand(Barbecuer barbecuer) {
super(barbecuer);
}
public void toExecute(){
System.out.println("十串羊肉串");
super.barbecuer.execute();
}
}
class pepper extends Command{
public pepper(Barbecuer barbecuer) {
super(barbecuer);
}
public void toExecute(){
System.out.println("多辣椒");
super.barbecuer.execute();
}
}
//最后是实际的执行者
class Barbecuer{
public void execute(){
System.out.println("收到");
}
}
public class Client {
}
根据代码画出我们的UML图
命令模式构成:
命令(Command):声明了一个给所有具体命令类的抽象接口。
具体命令(ConcreteCommand):定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
请求者(Invoker):负责调用命令对象执行请求,相关的方法叫做行动方法。
接收者(Receiver):负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。