java设计模式-17命令模式

定义:

  • 命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。
  • 命令模式把请求封装起来,可以动态地对它进行参数化、队列化和日志化等操作,从而使得系统更灵活。
  • 命令模式中的命令对象能够很容易地组合成复合命令,也就是宏命令,从而使系统操作更简单,功能更强大。
  • 由于发起命令的对象和具体的实现完全解耦,因此扩展新的命令就很容易,只需要实现新的命令对象,然后在装配的时候,把具体的实现对象设置到命令对象中,然后就可以使用这个命令对象,已有的实现完全不用变化。

代码

  • 盒式录音机,此录音机有播音(Play)、倒带(Rewind)和停止(Stop)功能
  • 录音机的键盘便是请求者(Invoker)角色;用户(Julia)是客户端角色,而录音机便是接收者角色。Command类扮演抽象命令角色,而PlayCommand、StopCommand和RewindCommand便是具体命令类。用户(Julia)不需要知道播音(play)、倒带(rewind)和停止(stop)功能是怎么具体执行的,这些命令执行的细节全都由键盘(Keypad)具体实施。 用户只需要在键盘上按下相应的键便可以了。
package com.example.demo;

public class test11 {
    public static void main(String[] args) {
        // 接受者对象
        AudioPlayer audioPlayer =new AudioPlayer();
        //创建命令对象
        Command command1=  new PlayCommand(audioPlayer);
        Command command2=  new RewindCommand(audioPlayer);
        Command command3=  new StopCommand(audioPlayer);
        //创建请求者对象
        Keypad keypad = new Keypad();
        keypad.setPlayCommand(command1);
        keypad.setRewindCommand(command2);
        keypad.setStopCommand(command3);
//测试一下
        keypad.play();
        keypad.rewind();
        keypad.stop();
        keypad.play();
        keypad.rewind();
       /* 播放...
        倒带...
        停止...
        播放...
        倒带...*/
    }
}

//接收者角色,由录音机类扮演
class AudioPlayer {
    void play() {
        System.out.println("播放...");
    }

    void rewind() {
        System.out.println("倒带...");
    }

    void stop() {
        System.out.println("停止...");
    }
}

//  抽象命令角色类
interface Command {
    void execute();
}

//具体命令角色类
//播放方法
class PlayCommand implements Command {
    private AudioPlayer audioPlayer;

    public PlayCommand(AudioPlayer audioPlayer) {
        this.audioPlayer = audioPlayer;
    }

    @Override
    public void execute() {
        audioPlayer.play();
    }
}
//倒带
class RewindCommand implements Command {
    private AudioPlayer audioPlayer;

    public RewindCommand(AudioPlayer audioPlayer) {
        this.audioPlayer = audioPlayer;
    }

    @Override
    public void execute() {
        audioPlayer.rewind();
    }
}
//停止
class StopCommand implements Command {
    private AudioPlayer audioPlayer;

    public StopCommand(AudioPlayer audioPlayer) {
        this.audioPlayer = audioPlayer;
    }

    @Override
    public void execute() {
        audioPlayer.stop();
    }
}
// 请求者角色,由键盘类扮演

class Keypad {
    private Command playCommand;
    private Command rewindCommand;
    private Command stopCommand;

    public Command getPlayCommand() {
        return playCommand;
    }

    public void setPlayCommand(Command playCommand) {
        this.playCommand = playCommand;
    }

    public Command getRewindCommand() {
        return rewindCommand;
    }

    public void setRewindCommand(Command rewindCommand) {
        this.rewindCommand = rewindCommand;
    }

    public Command getStopCommand() {
        return stopCommand;
    }

    public void setStopCommand(Command stopCommand) {
        this.stopCommand = stopCommand;
    }
    /**
     * 执行播放
     */
    void play(){
        playCommand.execute();
    }
    /** 执行倒带
     */
    void rewind(){
        rewindCommand.execute();
    }
    /** 执行停止
     */
    void stop(){
        stopCommand.execute();
    }
}

宏命令

  • 所谓宏命令简单点说就是包含多个命令的命令,是一个命令的组合。
  • 录音机有一个记录功能,可以把一个一个的命令记录下来,这就是所谓的宏命令集功能。
  public static void main(String[] args) {
        MacroCommand macroCommand =new MacroAudioCommand();
        // 接受者对象
        AudioPlayer audioPlayer = new AudioPlayer();
        //创建命令对象
        Command command1 = new PlayCommand(audioPlayer);
        Command command2 = new RewindCommand(audioPlayer);
        Command command3 = new StopCommand(audioPlayer);

        macroCommand.add(command1);
        macroCommand.add(command2);
        macroCommand.add(command3);
        System.out.println("========保存的命令=============");
        macroCommand.execute();

    }
interface MacroCommand extends Command {
    /**
     * 宏命令聚集的管理方法
     * 可以添加一个成员命令
     */
    void add(Command cmd);

    /**
     * 宏命令聚集的管理方法
     * 可以删除一个成员命令
     */
    void remove(Command cmd);
}


//具体的宏命令MacroAudioCommand类负责把个别的命令合成宏命令。
class MacroAudioCommand implements MacroCommand {
    List<Command> list = new ArrayList<>();

    @Override
    public void execute() {
        for (Command command : list) {
            command.execute();
        }
    }

    @Override
    public void add(Command cmd) {
        list.add(cmd);
    }
    @Override
    public void remove(Command cmd) {
            list.remove(cmd);
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员黄小青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值