Java设计模式之命令模式

本文深入探讨了命令模式的概念、优点及其实现方式,通过一个简单的音频播放器实例,展示了如何利用命令模式提高代码的灵活性和可维护性。包括命令模式的定义、原理、优点以及具体的代码实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     命令模式定义是讲“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

     命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。

     命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
 每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。


  命令允许请求的一方和接收请求的一方能够独立演化,从而具有以下的优点:


  (1)命令模式使新的命令很容易地被加入到系统里。


  (2)允许接收请求的一方决定是否要否决请求。


  (3)能较容易地设计一个命令队列。


  (4)可以容易地实现对请求的撤销和恢复。


  (5)在需要的情况下,可以较容易地将命令记入日志。

  比如我在进行听录音机的时候

       

        这里的接受者有AutoPlayer扮演

public class AudioPlayer {
    
    public void play(){
        System.out.println("播放...");
    }
    
    public void rewind(){
        System.out.println("倒带...");
    }
    
    public void stop(){
        System.out.println("停止...");
    }
}
     命令接口有Command

public interface Command {
 
    public void execute();
}

具体接口实现(比如play的方法)

   

ublic class PlayCommand implements Command {

    private AudioPlayer myAudio;
    
    public PlayCommand(AudioPlayer audioPlayer){
        myAudio = audioPlayer;   //体现关联关系的地方,以参数的方式传入
    }
    public void execute() {
        myAudio.play();
    }

}

     其余方法同上,


命令请求者是Keypad

    

public class Keypad {
    private Command playCommand;
    private Command rewindCommand;
    private Command stopCommand;
    
    public void setPlayCommand(Command playCommand) {
        this.playCommand = playCommand;
    }
    public void setRewindCommand(Command rewindCommand) {
        this.rewindCommand = rewindCommand;
    }
    public void setStopCommand(Command stopCommand) {
        this.stopCommand = stopCommand;
    }
    /**
     * 执行播放方法
     */
    public void play(){
        playCommand.execute();
    }
    /**
     * 执行倒带方法
     */
    public void rewind(){
        rewindCommand.execute();
    }
    /**
     * 执行播放方法
     */
    public void stop(){
        stopCommand.execute();
    }
}

    在客户端的执行

 public static void main(String[]args){
        //创建接收者对象
        AudioPlayer audioPlayer = new AudioPlayer();
        //创建命令对象
        Command playCommand = new PlayCommand(audioPlayer);
        Command rewindCommand = new RewindCommand(audioPlayer);
        Command stopCommand = new StopCommand(audioPlayer);
        //创建请求者对象
        Keypad keypad = new Keypad();
        keypad.setPlayCommand(playCommand);
        keypad.setRewindCommand(rewindCommand);
        keypad.setStopCommand(stopCommand);
        //测试
        keypad.play();
        keypad.rewind();
        keypad.stop();
        keypad.play();
        keypad.stop();
    }


       这里涉及到一个概念叫做宏命令,其实就是对我们所用的Command进行操作的一组命令,因为我们知道我们可以对命令进行增删改查。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值