Java设计模式之命令模式详解

网友投稿 264 2022-10-27


Java设计模式之命令模式详解

命令模式

定义:将请求封装成对象,这可以让你使用不同的请求http://、队列、或者日志来参数化其他对象。

何时使用命令模式?当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式。

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

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

调用者可以接收命令当作参数,甚至在运行时动态地进行。

优点:

1、降低了系统耦合度。

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

缺点:使用命令模式可能会导致某些系统有过多的具体命令类。

实现案例

需求:实现一个遥控器类,遥控器有多组开/关按钮,每组按钮控制一个电器对象的开和关。使用命令模式实现整个功能。

1、创建命令接口

package com.example.designpatternsdeAScfidaJemo.commandPattern;

/**

* 命令接口

*/

public interface Command {

public veAScfidaJoid execute();

}

2、创建电灯、电视类(命令接收者)

package com.example.designpatternsdemo.commandPattern;

/**

* 电灯

*/

public class Light {

//on/off动作

public void on(){

System.out.println("开启电灯");

}

public void off(){

System.out.println("关闭电灯");

}

}

package com.example.designpatternsdemo.commandPattern;

/**

* 电视

*/

public class TV {

public void on(){

System.out.println("开启电视");

}

public void off(){

System.out.println("关闭电视");

}

}

3、创建具体命令类

package com.example.designpatternsdemo.commandPattern;

/**

* 开启电灯命令类

*/

public class LightOnCommand implements Command{

//电灯对象

private Light mLight;

public LightOnCommand(Light light){

this.mLight = light;

}

@Override

public void execute() {

mLight.on();

}

}

package com.example.designpatternsdemo.commandPattern;

/**

* 关闭电灯命令类

*/

public class LightOffCommand implements Command{

//电灯对象

private Light mLight;

public LightOffCommand(Light light){

this.mLight = light;

}

@Override

public void execute() {

mLight.off();

}

}

这里省略电视的开关命令类

4、创建遥控器类

package com.example.designpatternsdemo.commandPattern;

/**

* 命令调用者

* 遥控器

*/

public class RemoteControl {

//保存开关命令对象的数组

Command[] onCommands;

Command[] offCommands;

public RemoteControl(){

//初始化数组

onCommands = new Command[2];

offCommands = new Command[2];

}

//存储命令

public void setCommand(int index,Command onCommand,Command offCommand){

onCommands[index] = onCommand;

offCommands[index] = offCommand;

}

//开按钮

public void onButtonPress(int btnIndex){

onCommands[btnIndex].execute();

}

//关按钮

public void offButtonPress(int btnIndex){

offCommands[btnIndex].execute();

}

}

5、创建客户类(测试类)

package com.example.designpatternsdemo.commandPattern;

public class Client {

public static void main(String[] args) {

//创建电灯对象(命令接收者)

Light myLight = new Light();

//创建电灯开关命令对象

LightOnCommand lightOnCommand = new LightOnCommand(myLight);

LightOffCommand lightOffCommand = new LightOffCommand(myLight);

//创建遥控器对象(命令调用者)

RemoteControl remoteControl = new RemoteControl();

//设置命令

remoteControl.setCommand(0,lightOnCommand,lightOffCommand);

//发起命令执行请求

remoteControl.onButtonPress(0);

remoteControl.offButtonPress(0);

TV myTv = new TV();

TvOnCommand tvOnCommand = new TvOnCommand(myTv);

TvOffCommand tvOffCommand = new TvOffCommand(myTv);

remoteControl.setCommand(1,tvOnCommand,tvOffCommand);

remoteControl.onButtonPress(1);

remoteControl.offButtonPress(1);

}

}

将开/关电灯、电视的请求封装成命令类对象,在类中的execute()方法调用具体电灯/电视的开关动作,调用时,遥控器类(命令调用者)只需调用具体某个命令对象的execute()方法,那他就会通知具体的电器来执行动作,这样,就实现了命令调用者和执行者之间的解耦。调用者不需要知道是谁执行动作,只需要调用命令对象的execute()方法去通知执行就可以。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:IP地址详解-你,是谁?
下一篇:思科WLC5508 7.4.121 版本 BUG
相关文章

 发表评论

暂时没有评论,来抢沙发吧~