设计模式-命令模式

设计模式-命令模式

将请求封装成对象,以便使用不同的请求、日志、队列等来参数化其他对象。命令模式也支持撤销操作。

class diagram
我们拿最近很火的智能家居来做举例
小米的智能家居描绘的应用场景之一是智能音箱可以控制其他家用电器工作
先定义抽象的Command类

public interface Command {
    void execute();
}

当前有两个家电,灯和电视

public class Light {

    public void turnOnLight(){
        System.out.println("灯被打开了");
    }

    public void turnOffLight(){
        System.out.println("灯被关闭了");
    }
}

public class Tv {

    public void openTv(){
        System.out.println("电视被打开了");
    }

    public void closeTv(){
        System.out.println("电视被关上了");
    }
}

分别实现对灯的开关请求

public class LightOnCommand implements Command{

    private Light light;

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

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

public class LightOffCommand implements Command{

    private Light light;

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

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

还有电视的开关请求

public class OpenTvCommand implements Command {

    private Tv tv;

    public OpenTvCommand(Tv tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.openTv();
    }
}

public class CloseTvCommand implements Command {

    private Tv tv;

    public CloseTvCommand(Tv tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.closeTv();
    }
}

作为Invoker的智能音箱

public class Speakers {

    private List<Command> commands = new ArrayList<>();

    public void addCommand(Command command){
        commands.add(command);
    }

    public void cancelCommand(Command command){
        commands.remove(command);
    }

    public void execute(){
        for (Command command : commands) {
            command.execute();
        }
        commands.clear();
    }
}

使用

public class Demo {
    public static void main(String[] args) {
        Light light = new Light();
        Tv tv = new Tv();
        Speakers speakers = new Speakers();

        speakers.addCommand(new OpenTvCommand(tv));
        speakers.addCommand(new LightOnCommand(light));
        speakers.execute();

        LightOffCommand lightOffCommand = new LightOffCommand(light);
        speakers.addCommand(new CloseTvCommand(tv));
        speakers.addCommand(lightOffCommand);
        speakers.cancelCommand(lightOffCommand);
        speakers.execute();
    }
}

命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开,实现了解耦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值