java设计模式——命令模式
1.命令模式概述
所谓的命令就是如:将军命令士兵进攻,老师命令学生上课要坐好,我们可以将命令这个过程进行解析。一个是发起命令的人,称为发送者,
一个称谓收到命令的人称为接收者,还有一个为命令本身,称为传递者。
2.命令模式的实现
拿我们生活中最接近的事例开关与电灯为例。当我们按下开关,灯会根据开关变暗或变亮。我们先按一开始我们最能想到的方式进行编写。
首先一个开关类和一个灯光类。如下图所示:





为灯光类抽象出一个电器,电器都有开和关的操作,开关关联电灯,用户操作电灯就会改变电灯的状态。
如果按照最普通的方法进行设计的话,开关与灯光会强耦合在一起不利于进行扩展,我们的电器不只灯光,开关也远不知有开关功能,当我们引入
电视、空调等。就得修改原有的类,新增电视、空调强耦合在开关类里面,并且开关得不停的新增新的方法,这样不停的修改也会隐藏更多的bug。
我们如何将他们的耦合进行分离?这就引入了我们的命令模式。
1.将开关当作发送者,将灯光、电视当作接收者。
2.我们将引入一个中间类叫做命令类。将发送的指令当成一个命令。让命令告诉给接收者要去做什么,接收者收到后做出对应的反应。
3.我们对这些类进行抽象。

这就是我们抽象出来的一个UML类图。接下去我们看看对应具体类是如何编写的。









这样的话我们就把发送者和接收者分离开来,发送者只管发送不用关心发送给谁,接收者只管收到消息要要去做什么操作。
我们现在有遥控器 有电视,遥控器上开关电视的按钮和调节音量的按钮,如果我们要对其进行扩展,新增一个调节频道的按钮,我们只需新增一个调节频道的命令类,在遥控器上多2个按钮即可,让调节频道命令类去通知电视该换频道了。
命令模式的缺点也是显而易见的,就是如果随着遥控器功能不断的强大,需要的命令就会越来越多,命令类就会创建很多,这是无法避免的。