设计模式之命令模式-使用命令模式实现遥控器及总结

设计模式之命令模式-使用命令模式实现遥控器及总结

先来看看项目结构:

说明:

1:命令接口对象

2:电灯打开或关闭命令

3:音响打开或关闭命令

4:音响音量增加或减少命令

来源:凯哥Java(kaigejava)

电灯开或关代码:

/**

* Created by kaigejava on 2019/8/30.

* 关灯的命令对象

*/

public class LightOffCommand  implements ICommandInterface{

private LightAPI light;

public LightOffCommand(LightAPI light){

this.light = light;

   }

@Override

public void execute() {

light.Off();

   }

@Override

public void undo() {

light.On();

   }

}

增加音响音量的类:

/**

* Created by kaigejava on 2019/8/30.

* 给音响增加音量命令对象

*/

public class StereoAddVolCommand  implements ICommandInterface{

private StereoAPI setreo;

public StereoAddVolCommand(StereoAPI stereo){

this.setreo = stereo;

   }

@Override

public void execute() {

int vol=   setreo.GetVol();

if(vol<11)

       {

setreo.AddVolume(++vol);

       }

   }

@Override

public void undo() {

int vol=   setreo.GetVol();

if(vol>0)

       {

setreo.downVolume(--vol);

       }

   }

}

命令模式总结:

1:内容

什么是命令模式?命令模式定义。参见上一篇

2:角色

invoker:调用者(如遥控器对象)

Command:命令接口或抽象类(如命令案例中命令接口)

received命令具体实现类(如电灯开对象、音响音量加/减对象)

3:执行顺序

调用者-->接收者-->命令

4:使用场景

当行为的请求者与行为的实现者之间需要解耦的时候(如遥控器项目,请求者是遥控器,行动实现者是各个不同的家电设备),这种场景下可以使用

5:何时使用

在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

6:优缺点

优点:

1、降低了系统耦合度;

2、新的命令可以很容易添加到系统中去。

缺点:

使用命令模式可能会导致某些系统有过多的具体命令类。比如我们遥控器项目中就多了很多具体命令对象。

7:注意事项

系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java研发军团

Netty-在-Dubbo-中如何应用

链接:http://thinkinjava.cn/2018/03/%E7%9C%8B-Netty-%E5%9C%A8-Dubbo-%E4%B8%AD%E5%A6...

9320
来自专栏Java研发军团

IDEA中的Maven实战

1.首先创建一个本地仓库的文件夹repository,然后在打开apache-maven-3.5.2/conf/settings.xml,在settings标签...

9630
来自专栏Java研发军团

IntellijIDEA配置tomcat最高版本

1. 首先下载tomcat9,下载地址https://tomcat.apache.org/

1.6K30
来自专栏Java研发军团

springboot面试题十题

多年来,随着新功能的增加,spring变得越来越复杂。只需访问https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用的...

25620
来自专栏Java研发军团

SpringBoot中配置logback

spring boot内部使用Commons Logging来记录日志,但也保留外部接口可以让一些日志框架来进行实现,例如Java Util Logging,L...

71910
来自专栏Java研发军团

面试题之Javaweb篇(一)

Servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的...

5920
来自专栏Java研发军团

Netty 粘包 & 拆包 & 编码 & 解码 & 序列化

Netty 作为一个网络框架,对 TCP 连接中的问题都做了全面的考虑,比如粘包拆包导致的半包问题,如何编解码,如何实现私有协议,序列化等等。

12520
来自专栏Java研发军团

深入理解Spring-之-源码剖析AOP(XML配置方式)

Spring 的两大核心,一是IOC,我们之前已经学习过,并且已经自己动手实现了一个,而令一个则是大名鼎鼎的 AOP,AOP的具体概念我就不介绍了。

6720
来自专栏Java研发军团

Netty 解码器抽象父类 ByteToMessageDecoder 源码解析

链接:https://www.jianshu.com/p/4c35541eec10

10010
来自专栏Java研发军团

springboot面试题(二)

Swagger广泛用于可视化API,使用Swagger UI为前端开发人员提供在线沙箱。Swagger是用于生成RESTful Web服务的可视化表示的工具,规...

7610

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励