设计模式-命令模式

本文章根据搜索命令模式的百度百科来进行理解的

使用场景

  1. 系统需要将请求调用者和接收者解耦,使得调用者和接收者不直接交互;
  2. 系统需要在不同的时间指定请求、将请求排队和指定请求;
  3. 系统需要支持命令的撤销操作和恢复操作;
  4. 系统需要将一组操作组合在一起,即支持宏命令。

概述

实现行为请求者和行为实现者松耦合,并将一组行为抽象为对象,这就是命令模式。
注:命令模式尝试以物件代替实际行动。

优点

  1. 降低对象之间的耦合度;
  2. 新的命令可以很容易加入到系统中;
  3. 可以比较容易地设计一个组合命令;
  4. 调用同一方法实现不同的功能。

实例分析

以电视机和遥控器为实例解析,电视机是请求的接收者,遥控器是请求的发送者,遥控器上的不同按钮对应电视机不同的操作,假设遥控器上有开机、关机和切换频道按钮。

  1. 创建电视机(命令接收者)
/**
 * @author 
 * @date 2021/7/2
 *
 * desc:电视机类(命令接收者)
 */
public class Tv {
    public int currentChannel = 0;

    public void turnOn(){
        System.out.println("TV IS ON");
    }

    public void turnOff(){
        System.out.println("TV IS OFF");
    }

    public void turnChannel(int channel){
        this.currentChannel = channel;
        System.out.println("NOW TV CHANNEL IS:" + channel);
    }

}
  1. 创建执行命令的接口
/**
 * @author 
 * @date 2021/7/2
 *
 * desc:遥控器各个按钮的统一执行接口
 * 遥控器通过该接口的execute方法发送命令给电视机需要执行的操作
 */
public interface Command {
    void execute();
}
  1. 创建遥控器的开机命令
/**
 * @author 
 * @date 2021/7/2
 *
 * desc:遥控器的开机命令
 */
public class CommandOfTurnOn implements Command {
    private Tv onTv;

    public CommandOfTurnOn(Tv onTv){
        this.onTv = onTv;
    }

    public void execute() {
        onTv.turnOn();
    }
}
  1. 创建遥控器的关机命令
/**
 * @author 
 * @date 2021/7/2
 *
 * desc:遥控器的关机命令
 */
public class CommandOfTurnOff implements Command{
    private Tv offTv;

    public CommandOfTurnOff(Tv offTv){
        this.offTv = offTv;
    }

    public void execute() {
        offTv.turnOff();
    }
}
  1. 创建遥控器的切换频道命令
/**
 * @author 
 * @date 2021/7/2
 *
 * desc:遥控器的频道切换命令
 */
public class CommandOfTurnChannel implements Command{

    private Tv turnChannelTv;
    private int channel;

    public CommandOfTurnChannel(Tv turnChannelTv,int channel){
        this.turnChannelTv = turnChannelTv;
        this.channel = channel;
    }

    public void execute() {
        turnChannelTv.turnChannel(channel);
    }
}
  1. 创建遥控器类
/**
 * @author 
 * @date 2021/7/2
 *
 * desc:遥控器类
 */
public class Control {
    private Command commandOn,commandOff,commandChanl;

    public Control(Command on,Command off,Command channel){
        this.commandOn = on;
        this.commandOff = off;
        this.commandChanl = channel;

    }

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

    public void turnOff(){
        commandOff.execute();
    }

    public void turnChannel(){
        commandChanl.execute();
    }
}

  1. 测试实现类
/**
 * @author 
 * @date 2021/7/2
 */
public class Client {
    public static void main(String[] args) {
        // 电视机对象(接收遥控器的请求)
        Tv myTv = new Tv();

        //封装一个遥控器开始>>>>>>>>>>>>>>>
        CommandOfTurnOn commandOfTurnOn = new CommandOfTurnOn(myTv);// 开机命令(开机按钮)
        CommandOfTurnOff commandOfTurnOff = new CommandOfTurnOff(myTv);// 关机命令(关机按钮)
        CommandOfTurnChannel commandOfTurnChannel = new CommandOfTurnChannel(myTv,2);// 切换频道命令(切换频道按钮)
        Control control = new Control(commandOfTurnOn,commandOfTurnOff,commandOfTurnChannel); // 实现遥控器对象(获取一个遥控器)
        //封装一个遥控器结束>>>>>>>>>>>>>>>

        // 遥控器的按钮操作(即遥控器可以发出的命令)
        control.turnOn(); // 遥控器操作开机按钮
        control.turnOff(); // 遥控器操作关机按钮
        control.turnChannel(); // 遥控器操作切换频道按钮

    }
}

版权声明:本文为qq_35238590原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。