设计模式--命令模式

看一个智能生活项目需求:制作豆浆,编写程序。

说明如下:

  1. 我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装app就可以控制这些家电工作。
  2. 这些智能家电来自不同的厂家,我不想根据每一种家电安装不同的app分别控制,我只希望只要一个app可以控制所有智能家电。
  3. 要实现一个app控制所有智能家电的需要,则每个智能家电厂家都要提供一个统一的接口给app调用,这样可以考虑使用命令模式。
  4. 命令模式可以将"动作的请求者"从"动作的执行者"对象中解耦了出来。
  5. 在我们的例子中,动作的请求者是手机app,动作的执行者是每个厂家的同一个电子产品。

命令模式(Command Pattern)介绍:

  1. 在软件设计中,我们通常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需要在程序运行时指定一个具体的接收者即可,此时,可以使用命令模式来设计。
  2. 命令模式使得请求发送者和请求接受者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。
  3. 在命令模式中,会将请求封装为一个对象,以便使用不同的参数来表示不同的请求(即命名)。同时,命令模式也支持可以撤销的操作。
  4. 通俗易懂的理解:将军发布命令、士兵去执行。其中有几个角色:将军(命令发布者)、士兵(命令的具体执行者)、命令(连接将军和士兵)。

Invoke是调用者(将军)、Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对像。

命令模式类图:

对原理类图的说明即模板方法模式的角色和职责:

  1. Invoker调用者角色。
  2. Command是命令角色,需要执行的所有命令,可以是接口或者抽象类。
  3. Receiver是接受者角色,知道如何实施和执行一个请求相关的操作。
  4. ConcreteCommand是一个具体的命令类,实现了Command抽象类或者接口,将一个接受者对象与一个动作绑定,调用接收者相应的操作实现execute()。

命令模式解决智能生活项目

  1. 分析:

  1. UML类图:

关键代码:

package com.xia.designmode.study.commandpattern;

/**

* 命令模式--具体实现命令角色

*

* */

public class LightOffCommand implements Command{

//聚合命令接收者

private LightReceiver lightReceiver;

public LightOffCommand(LightReceiver lightReceiver) {

this.lightReceiver = lightReceiver;

}

@Override

public void execute() {

//关闭电灯,调用接收者的方法

lightReceiver.off();

}

@Override

public void cancel() {

//打开电灯,调用接收者的方法

lightReceiver.on();

}

}

package com.xia.designmode.study.commandpattern;

/**

* 命令模式--具体实现命令角色

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值