设计模式-----命令模式

  • 命令模式

将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。命令模式通过这种封装的方式实现将客户端和接收端解耦。

  • 类型

行为型模式

  • 命令模式的角色

抽象命令接口Command:定义命令的接口,声明执行的方法。

具体的命令对象ConcreteCommand:持有具体的接受者对象,完成具体的具体的命令。
接受者对象Receiver:接受者对象,真正执行命令的对象。
传递命令对象Invoker:持有命令对象,要求命令对象执行请求。
客户端对象Client:创建具体命令的对象并且设置命令对象的接受者。

  • 关系图

 

例子:呼叫小爱同学帮你开灯..................

代码

抽象命令接口Command:

package com.command;

/**
 * 抽象的命令接口,定义具体命名的接口
 */
public interface Command {
    /**
     *执行命名的接口
     */
    void execute();
}

具体的命令对象ConcreteCommand:(开灯命令,关灯命令)

package com.command;

/**
 * @Author zhaoxin
 * @Email [email protected]
 * @Description //TODO
 * @Date 2019/4/8
 **/
public class LightOnCommand implements Command {
    private Light light;

    /**
     * 创建开灯命令的时候,传入具体的灯对象,由灯对象操作自己
     * @param light
     */
    public LightOnCommand(Light light){
        this.light=light;
    }

    @Override
    /**
     * 具体的灯对象调用自己的开灯方法
     */
    public void execute() {
        light.lightOn();
    }
}
package com.command;

/**
 * @Author zhaoxin
 * @Email [email protected]
 * @Description //TODO
 * @Date 2019/4/8
 **/
public class LightOffCommand  implements Command{
    private Light light;

    /**
     * 创建开灯命令的时候,传入具体的灯对象,由灯对象操作自己
     * @param light
     */
    public LightOffCommand(Light light){
        this.light=light;
    }


    @Override
    /**
     * 具体的灯对象调用自己的关灯方法
     */
    public void execute() {
        light.lightOff();
    }
}

传递命令对象Invoker:

package com.command;

/**
 * @Author zhaoxin
 * @Email [email protected]
 * @Description //TODO
 * @Date 2019/4/8
 **/
public class XiaoAi {
    private Command command;

    /**
     * 设置具体命令
     * @param command
     */
    public void setCommand(Command command) {
        this.command = command;
    }

    /**
     * 执行命令
     */
    public void doCommand(){
        command.execute();
    }
}

接受者对象Receiver:

package com.command;

/**
 * @Author zhaoxin
 * @Email [email protected]
 * @Description //TODO
 * @Date 2019/4/8
 **/
public class Light {
    /**
     * 开灯方法
     */
    public void lightOn(){
        System.out.println("灯已打开");
    }

    /**
     * 关灯方法
     */
    public void lightOff(){
        System.out.println("灯已关闭");
    }
}

客户端对象:

package com.command;

/**
 * @Author zhaoxin
 * @Email [email protected]
 * @Description //TODO
 * @Date 2019/4/8
 **/
public class Client {
    public static void main(String[] args) {
        //创建传递着
        XiaoAi xiaoAi=new XiaoAi();
        //创建命令执行者
        Light light=new Light();
        //创建开灯命令
        LightOnCommand lightOnCommand=new LightOnCommand(light);
        System.out.println("小艾,帮我开灯");
        xiaoAi.setCommand(lightOnCommand);
        xiaoAi.doCommand();
        System.out.println("--------------------------------------------");
        System.out.println("小艾,帮我关灯");
        LightOffCommand lightOffCommand=new LightOffCommand(light);
        xiaoAi.setCommand(lightOffCommand);
        xiaoAi.doCommand();


    }
}

猜你喜欢

转载自blog.csdn.net/qq_37668945/article/details/89094306