首页 > 其他 > 详细

设计模式(7)命令模式

时间:2019-03-11 00:53:13      阅读:210      评论:0      收藏:0      [点我收藏+]

在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。

假设现在我们需要制作一个万能遥控器,去控制日光灯、音响和电视的开关,我们使用遥控器进行开关操作的时候,并不关心遥控器具体请求是哪个,我们只知道要进行开关操作,这时候就可以用命令模式来进行设计。

技术分享图片

首先我们先定义命令接口,使所有的命令都继承这个接口,如开灯命令、关灯命令等。

技术分享图片
public interface Command {
    // 命令
    public void excute();

}
Command

然后我们定义一个遥控器,它有着开关的功能,也就是两个命令,开启命令和关闭命令。

技术分享图片
public class RemoteControl {

    private Command onCommand;

    private Command offCommand;

    public RemoteControl() {
        this.onCommand = new NoCommd();
        this.offCommand = new NoCommd();
    }

    public void setCommand(Command onCommand, Command offCommand) {
        this.onCommand = onCommand;
        this.offCommand = offCommand;
    }

    public void onButtonWasPushed() {
        this.onCommand.excute();
    }

    public void offButtonWasPushed() {
        this.offCommand.excute();
    }
}
RemoteControl

接下来是音响、日光灯、电视机这三个实体类

技术分享图片
public class Audio {
    public void on() {
        System.out.println("Audio is on!");
    }

    public void off() {
        System.out.println("Audio is off!");
    }
}

public class Light {
    public void on() {
        System.out.println("Light is on!");
    }

    public void off() {
        System.out.println("Light is off!");
    }
}

public class Television {
    public void on() {
        System.out.println("Television is on!");
    }

    public void off() {
        System.out.println("Television is off!");
    }
}
Audio Light Television

然后是实现各个电器开关命令的命令类

技术分享图片
public class AudioOffCommand implements Command {

    private Audio audio;

    public AudioOffCommand(Audio audio) {
        this.audio = audio;
    }

    @Override
    public void excute() {
        audio.off();
    }
}
AudioOffCommand
技术分享图片
public class AudioOnCommand implements Command {

    private Audio audio;

    public AudioOnCommand(Audio audio) {
        this.audio = audio;
    }

    @Override
    public void excute() {
        audio.on();
    }
}
AudioOnCommand
技术分享图片
public class LightOffCommand implements Command {

    private Light light;

    public LightOffCommand(Light light) {
        this.light = light;
    }

    @Override
    public void excute() {
        light.off();
    }
}
LightOffCommand
技术分享图片
public class LightOnCommand implements Command {

    private Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void excute() {
        light.on();
    }
}
LightOnCommand
技术分享图片
public class TelevisionOffCommand implements Command {

    private Television television;

    public TelevisionOffCommand(Television television) {
        this.television = television;
    }

    @Override
    public void excute() {
        television.off();
    }
}
TelevisionOffCommand
技术分享图片
public class TelevisionOnCommand implements Command {

    private Television television;

    public TelevisionOnCommand(Television television) {
        this.television = television;
    }

    @Override
    public void excute() {
        television.on();
    }
}
TelevisionOnCommand

测试

public static void main(String[] args) {
        RemoteControl remoteControl = new RemoteControl();
        Light light = new Light();
        LightOnCommand lightOnCommand = new LightOnCommand(light);
        LightOffCommand lightOffCommand = new LightOffCommand(light);
        System.out.println("使用万能遥控器控制日光灯");
        remoteControl.setCommand(lightOnCommand, lightOffCommand);
        remoteControl.onButtonWasPushed();
        remoteControl.offButtonWasPushed();

        Audio audio = new Audio();
        AudioOnCommand audioOnCommand = new AudioOnCommand(audio);
        AudioOffCommand audioOffCommand = new AudioOffCommand(audio);
        System.out.println("使用万能遥控器控制音响");
        remoteControl.setCommand(audioOnCommand, audioOffCommand);
        remoteControl.onButtonWasPushed();
        remoteControl.offButtonWasPushed();

        Television television = new Television();
        TelevisionOnCommand televisionOnCommand = new TelevisionOnCommand(television);
        TelevisionOffCommand televisionOffCommand = new TelevisionOffCommand(television);
        System.out.println("使用万能遥控器控制电视");
        remoteControl.setCommand(televisionOnCommand, televisionOffCommand);
        remoteControl.onButtonWasPushed();
        remoteControl.offButtonWasPushed();
    }

结果

技术分享图片

这样就用命令模式实现了万能遥控器的功能。

命令模式将发出请求的万能遥控器和执行请求的对象解耦了,降低了耦合度。新的命令可以很容易地加入到其中,如果需要控制电风扇,只需要创建开启和关闭电风扇的命令,然后绑定到万能遥控器中即可。

但是每个命令都需要创建一个命令对象,这就导致了具体命令类的数量会很多,使用的时候需要谨慎。

设计模式(7)命令模式

原文:https://www.cnblogs.com/oeleven/p/10508240.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!