Java命令模式 Java设计模式之命令模式详解
在下木子李 人气:0想了解Java设计模式之命令模式详解的相关内容吗,在下木子李在本文为您仔细讲解Java命令模式的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Java命令模式,java设计模式,下面大家一起来学习吧。
命令模式
定义:将请求封装成对象,这可以让你使用不同的请求、队列、或者日志来参数化其他对象。
何时使用命令模式?当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式。
在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作。
调用者通过调用命令对象的execute()方法发出请求,这会使接收者的动作被调用。
调用者可以接收命令当作参数,甚至在运行时动态地进行。
优点:
1、降低了系统耦合度。
2、新的命令可以很容易添加到系统中去。
缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
实现案例
需求:实现一个遥控器类,遥控器有多组开/关按钮,每组按钮控制一个电器对象的开和关。使用命令模式实现整个功能。
1、创建命令接口
package com.example.designpatternsdemo.commandPattern; /** * 命令接口 */ public interface Command { public void 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()方法去通知执行就可以。
加载全部内容