首页 > 其他分享 >设计模式 16 命令模式

设计模式 16 命令模式

时间:2022-08-14 17:46:28浏览次数:84  
标签:16 开启 模式 命令 电视机 Command receiver 设计模式 public

参考源

https://www.bilibili.com/video/BV1u3411P7Na?p=24&vd_source=299f4bc123b19e7d6f66fefd8f124a03


命令模式(Command Pattern)属于行为型模式

概述

现在各大电子厂商都在推智能家居,即可以通过手机这一个终端控制多个家用电器,比之前的单个设备智能由对应遥控器控制的方案要方便很多。这其实就是命令模式的应用。

命令模式将请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

代码实现

这里以手机控制电视机开启为例介绍命令模式:

1、定义命令接收者

/**
 * 命令接收者
 */
public interface Receiver {

    /**
     * 开启
     */
    void open();

}

2、定义电视机

/**
 * 电视机
 */
public class Television implements Receiver{
    
    @Override
    public void open() {
        System.out.println("电视机已开启");    
    }
}

3、定义命令

/**
 * 命令
 */
public abstract class Command {

    /**
     * 命令接收者
     */
    private final Receiver receiver;

    /**
     * 绑定命令与命令接收者
     * @param receiver 命令接收者
     */
    public Command(Receiver receiver) {
        this.receiver = receiver;
    }

    /**
     * 执行命令
     */
    public void execute() {
        // 开启
        this.receiver.open();
    }

}

4、定义开启命令

/**
 * 开启命令
 */
public class OpenCommand extends Command {

    /**
     * 开启电视机
     * @param television 电视机
     */
    public OpenCommand(Television television) {
        super(television);
    }

}

5、定义控制器

/**
 * 控制器
 */
public class Controller {

    /**
     * 发出命令
     * @param command 命令
     */
    public static void call(Command command) {
        command.execute();
    }

}

6、调用

// 定义电视机
Television television = new Television();
// 使用终端设备发送命令到控制器
// 控制器发出开启命令到电视机
// 电视机接收到开启命令后开始启动
Controller.call(new OpenCommand(television));

输出结果为:

电视机已开启

这样就实现了通过命令开启电视机。如果需要添加其他命令,比如说关闭,只需要定义一个关闭命令继承 Command,再用构造方法指定要控制的设备即可。

优缺点

优点

1、降低了系统耦合度。

2、新的命令可以很容易添加到系统中去。

缺点

使用命令模式可能会导致某些系统有过多的具体命令类。

使用场景

需要用命令的地方都可以使用命令模式,比如:

1、GUI 中每一个按钮都是一条命令。

2、模拟 CMD。

标签:16,开启,模式,命令,电视机,Command,receiver,设计模式,public
From: https://www.cnblogs.com/codesail/p/16585858.html

相关文章

  • [2016年NOIP普及组] 回文日期
    部分正确  没考虑月份日期的合法性正确   ......
  • [2016年NOIP普及组] 回文日期
    试题分析:本题是一道暴力枚举题,我们可以直接从输入的date1开始遍历到date2,其余的我们只需要判断是否超出日期即可。注意:没有00月与00日,这里需要单独判断。代码如下: ......
  • CF 1600~1800 思维题泛做
    CF1592CBakryandPartitioning给定一棵\(n\)个节点,每个节点有点权的树,最多拆成\(k\)个连通块,问是否有方案使得所有联通块的异或和相等。\(n,k\le10^5,a_i\l......
  • 工厂模式
    写在前面: 初为职场新手,难免会把代码写的一把梭。遇到业务的时候直接if-else干。但是本着不想被开除的原则,还是学习一下设计模式,今天来看看设计模式之工厂模式。用需求......
  • [2016年NOIP普及组] 买铅笔
    [2016年NOIP普及组]买铅笔思路:P老师决定只买同一种包装的铅笔同时也要最划算,那么可以循环进行3次计算。每次的价格都与最小值比较,如果小于最小值,就代替当前最小值。分析......
  • 16.不定式
    1.不定式的构成和特征  不定式由“to+动词原形”构成。及物动词的不定式可以带宾语,也可以被状语修饰,构成不定式短语,如toreadthetextslowly。不及物动词的不定式......
  • 《Effective Java》第16条:要在仅有类中使用访问方法而非公有域
    《EffectiveJava》第16条:要在仅有类中使用访问方法而非公有域一、问题有时候我们需要定义一些类用来集中实例域(Java对象中的数据)。经常我们会把这些数据域声明为public......