Head First设计模式学习笔记-------(6)命令模式

今天,我们又接到了一个棘手的项目。让我们来看看项目要求吧。


让我们看看他们发过来的光盘里的类和遥控器的模型吧



如果直接设计这样一个程序,问题就非常大了,我们需要把“动作的请求者”从“动作的执行者”对象中解耦出来,什么意思呢?

让我们看一个之前讲到过的餐厅的例子吧


如同这张图里面说描述,女招待员不需要知道订单上有什么,需要怎么完成,只要把订单放在柜台然后调用orderUP方法就可以了。

让我们来看一下这个图对应的命令模式的图


让我们先做一个简单遥控器来熟悉下这个命令模式吧

实现命令接口:

public interface Command {
    public void execute();   //这个接口只有一个方法
}
实现一个打开电灯的命令:

public class LightOnCommand implements Command {     //命令需要实现Command接口
    Light light;
    
    public LightOnCommand (Light light) {      //构造器被传入了某个电灯,以便让这个命令控制,然后记录在实例变量中。一旦调用了execute方法,就由这个电灯对象成为接收者,负责接受请求。
        this.light = light;
    }
    
    public void execute() {          //这个execute方法调用接收对象的on方法
        light.on();         
    }
}
使用命令对象:
public class SimpleRemoteControl {
    Command slot;                  //有一个插槽持有命令,而这个命令控制着一个装置
    
    public SimpleRemoteControl () {}
    
    public void setCommand(Command command) {     //这个方法用来设置插槽控制的命令
        slot = command;
    }
    
    public void buttonWasPressed() {            //当按下按钮时,这个方法就会被调用,使得当前命令衔接插槽,并调用它的execute方法
        slot.execute();
    }
}
看了这个简单遥控器的例子,是不是稍微有点了解这个模式了。
定义命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

命令模式类图:


让我们看一下我们为这个项目写的遥控器API文档吧


命令模式总结:

1:命令模式将发出请求的对象和执行请求的对象解耦。

2:在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作。

3:调用者通过命令对象的execute方法发出请求,这会使得接收者的动作被调用。

4:调用者可以接受命令当做参数,甚至在运行时动态地进行。

5:命令也可以用来实现日志和事物系统。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值