设计模式之命令模式

参考博客:https://www.cnblogs.com/java-my-life/archive/2012/06/01/2526972.html   侵权删除

2019-06-27 15:10:03

什么是命令模式:一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

适用性:

基本类图:见参考博客

命令模式的本质: 1、将行为(接受者的行为)封装为对象(Command对象),使得我们可以通过对该对象的操作而实现对行为的操作。2、通过Command类引入间接性

命令模式的基本成员:

  抽象接收者: 将多个具体接受者抽象

  具体接受者:实际执行行为的对象

  抽象命令:多种命名的抽象

  具体命令:命令对象,成员有接受者的引用和执行命令的方法。

  命令请求者:发出请求的对象,成员有命令对象和发出命令请求的方法。

  客户端:装配命令和命令请求者

命令模式的基本代码:

/**
 * @InterfaceName Command
 * @Author wangyudi
 * @Date 2019/6/27 14:51
 * @Version 1.0
 * @Description 抽象命令类
 */
public interface Command {
    public void execute();
}


/**
 * @ClassName CommandTurnOn
 * @Author wangyudi
 * @Date 2019/6/27 14:52
 * @Version 1.0
 * @Description  具体命令类
 */
public class CommandTurnOn implements Command {
    //传入具体的接受者,实际的执行者
    private Light light;
    public CommandTurnOn(Light light){
        this.light = light;
    }

    @Override
    public void execute() {
        light.TurnOn();
    }
}


/**
 * @ClassName CommandTurnDown
 * @Author wangyudi
 * @Date 2019/6/27 14:52
 * @Version 1.0
 * @Description  具体命令类
 */
public class CommandTurnDown implements Command {
    //传入具体的接受者,实际的执行者
    private Light light;
    public CommandTurnDown(Light light){
        this.light = light;
    }

    @Override
    public void execute() {
        light.TurnDown();
    }
}

 

 

/**
 * @ClassName Light
 * @Author wangyudi
 * @Date 2019/6/27 14:53
 * @Version 1.0
 * @Description 接受者
 */
public class Light {
    public void TurnOn(){
        System.out.println("Light turn on");
    }
    public void TurnDown(){
        System.out.println("Light turn off");
    }
}

 

 

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName Switch
 * @Author wangyudi
 * @Date 2019/6/27 14:57
 * @Version 1.0
 * @Description 命令请求者
 */
public class Switch {
    private Command commandOn;
    private Command commandDown;

    private ArrayList<Command> commands;

    public Switch(Command commandOn, Command commandDown) {
        this.commandOn = commandOn;
        this.commandDown = commandDown;
        commands = new ArrayList<Command>();
    }
    public void add(Command command){
        commands.add(command);
    }

    public void executeCommands(){
        for(Command e :commands)
            e.execute();
    }

    public void turnOn(){
        commandOn.execute();
    }
    public void turnDown(){
        commandDown.execute();
    }
}

 

 

/**
 * @ClassName TestCase
 * @Author wangyudi
 * @Date 2019/6/27 15:01
 * @Version 1.0
 * @Description 测试用例
 */
public class TestCase {
    public static void main(String[] args) {
        Light light = new Light();
        CommandTurnDown commandTurnDown = new CommandTurnDown(light);
        CommandTurnOn commandTurnOn = new CommandTurnOn(light);
        Switch aSwitch = new Switch(commandTurnDown, commandTurnOn);

        aSwitch.turnDown(); //实例化一个命令,并执行(可以写成  aSwitch.turnDown(new CommandTurnDown(light));
        aSwitch.turnOn();
        System.out.println("=================================================");
        aSwitch.add(new CommandTurnOn(light));  //实例化一个命令,并将该命令对象放入队列中
        aSwitch.add(new CommandTurnDown(light));
        aSwitch.add(new CommandTurnOn(light));
        aSwitch.executeCommands(); //执行队列中的所有命令

    }
}

//结果
Light turn on
Light turn off
=================================================
Light turn on
Light turn off
Light turn on

 

posted @ 2019-06-27 15:22  由走啦啦啦  阅读(124)  评论(0编辑  收藏  举报