设计模式——命令模式

Posted shenqiaqia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式——命令模式相关的知识,希望对你有一定的参考价值。

这次来看下命令模式:

先看下head first中对命令模式的定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

接下来,再来看下类图:

技术图片

最后来看下代码:

public interface Command 

    void execute();

    void undo();

public class LightOffCommand implements Command 

    private Light light = new Light();

    public LightOffCommand() 
        this.light = light;
    

    @Override
    public void execute() 
        light.off();
    

    @Override
    public void undo() 
        light.on();
    

  

public class LightOnCommand implements Command 

    private Light light = new Light();

    public LightOnCommand() 
        this.light = light;
    

    @Override
    public void execute() 
        light.on();
    

    @Override
    public void undo() 
        light.off();
    

public class Light 

    public void on() 
        System.out.println("Light is on");
    

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

  

public class NoCommand implements Command 

    @Override
    public void execute() 

    

    @Override
    public void undo() 

    

  

public class StereoOffWithCDCommand implements Command 

    private Stereo stereo = new Stereo();

    public StereoOffWithCDCommand() 
        this.stereo = stereo;
    

    @Override
    public void execute() 
        stereo.off();
    

    @Override
    public void undo() 
        stereo.on();
        stereo.setCD();
        stereo.setVolume(11);
    

  

public class StereoOnWithCDCommand implements Command 

    private Stereo stereo = new Stereo();

    public StereoOnWithCDCommand() 
        this.stereo = stereo;
    

    @Override
    public void execute() 
        stereo.on();
        stereo.setCD();
        stereo.setVolume(11);
    

    @Override
    public void undo() 
        stereo.off();
    

  

public class Stereo 

    public void on() 
        System.out.println("Stereo is on");
    

    public void setCD() 
        System.out.println("CD is set");
    

    public void setVolume(int volume) 
        System.out.println("Volume is set " + volume);
    

    public void off() 
        System.out.println("Stereo is off");
    

  

public class RemoteControl 

    private Command[] onCommands;
    private Command[] offCommands;
    private Command undoCommand;

    public RemoteControl() 
        onCommands = new Command[2];
        offCommands = new Command[2];

        Command command = new NoCommand();
        for (int i = 0; i < 2; i++) 
            onCommands[i] = command;
            offCommands[i] = command;
        
        undoCommand = command;
    

    public void setCommand(int slot, Command onCommand, Command offCommand) 
        onCommands[slot] = onCommand;
        offCommands[slot] = offCommand;
    

    public void onButtonWasPush(int slot) 
        onCommands[slot].execute();
        undoCommand = onCommands[slot];
    

    public void offButtonWasPush(int slot) 
        offCommands[slot].execute();
        undoCommand = offCommands[slot];
    

    public void undoButtonWasPushed() 
        undoCommand.undo();
    

    @Override
    public String toString() 
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("\\n------ Remote Control ------\\n");
        for (int i = 0; i < onCommands.length; i++) 
            stringBuffer.append("[slot " + i + "] " + onCommands[i].getClass().getName() + "     " + offCommands[i].getClass().getName() + "\\n");
        

        return stringBuffer.toString();
    

  

public class RemoteControlTest 

    public static void main(String[] args) 

        RemoteControl remte = new RemoteControl();
        LightOnCommand lightOnCommand = new LightOnCommand();
        LightOffCommand lightOffCommand = new LightOffCommand();
        StereoOnWithCDCommand onWithCDCommand = new StereoOnWithCDCommand();
        StereoOffWithCDCommand offWithCDCommand = new StereoOffWithCDCommand();

        remte.setCommand(0, lightOnCommand, lightOffCommand);
        remte.setCommand(1, onWithCDCommand, offWithCDCommand);

        System.out.println(remte.toString());

        remte.onButtonWasPush(0);
        remte.onButtonWasPush(1);
        remte.offButtonWasPush(0);
        remte.offButtonWasPush(1);

        remte.undoButtonWasPushed();
    

  

  

  

以上是关于设计模式——命令模式的主要内容,如果未能解决你的问题,请参考以下文章

是否有在单个活动中处理多个片段的 Android 设计模式?

尝试使用片段保存夜间模式状态

Sublime text3最全快捷键清单

Sublime text3最全快捷键清单

csharp C#代码片段 - 使类成为Singleton模式。 (C#4.0+)https://heiswayi.github.io/2016/simple-singleton-pattern-us

java 查看寻呼机设计模式与片段。