命令模式

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

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

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

调用者通过调用命令对象的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()方法去通知执行就可以。

到此这篇关于java设计模式之命令模式详解的文章就介绍到这了,更多相关java命令模式内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!