设计模式-命令模式

命令模式

命令模式是对命令的封装,每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式解耦了请求方与接收方,请求方只需要请求执行命令,不用关心命令时怎样被接收,怎样被操作以及是否被执行等。命令模式属于行为型模式。

角色:
  • 接收者角色(Receiver):负责具体实施或执行一个请求。
  • 命令角色(Command):定义需要执行的所有命令行为。
  • 具体命令角色(ConcreteCommand):该类内部维护一个接收者(Invoker),在其execute()方法中调用Invoker的相关方法。
  • 请求者角色(Invoker):接收客户端的命令,并执行命令。

command角色就是作为Receiver与Invoker的中间件,解耦了彼此。

举例:播放器,具有播放功能,拖动进度条功能,停止播放器功能,暂停功能。

接收者角色,播放器内核类:

package com.jdwa.command;

public class GPlayer {
    public void play(){
        System.out.println("正常播放。。。");
    }

    public void speed(){
        System.out.println("拖动进度条。。。");
    }

    public void stop(){
        System.out.println("停止播放。。。");
    }

    public void pause(){
        System.out.println("暂停播放。。。");
    }

}

命令角色:

package com.jdwa.command;

public interface IAction {
    void excute();
}

具体命令:

package com.jdwa.command;

public class PlayAction implements IAction{
    
    private GPlayer gPlayer;
    
    public PlayAction(GPlayer gPlayer){
        this.gPlayer = gPlayer;
    }
    
    @Override
    public void excute() {
        gPlayer.play();
    }
}
package com.jdwa.command;

public class SpeedAction implements IAction {

    private GPlayer gPlayer;

    public SpeedAction(GPlayer gPlayer) {
        this.gPlayer = gPlayer;
    }

    @Override
    public void excute() {
        gPlayer.speed();
    }
}
package com.jdwa.command;

public class StopAction implements IAction {

    private GPlayer gPlayer;

    public StopAction(GPlayer gPlayer) {
        this.gPlayer = gPlayer;
    }

    @Override
    public void excute() {
        gPlayer.stop();
    }
}
package com.jdwa.command;

public class PauseAction implements IAction {
    private GPlayer gPlayer;

    public PauseAction(GPlayer gPlayer) {
        this.gPlayer = gPlayer;
    }

    @Override
    public void excute() {
        gPlayer.pause();
    }
}

请求者角色,控制条

package com.jdwa.command;

import java.util.ArrayList;
import java.util.List;

public class Controller {
    private List<IAction> actions = new ArrayList<>();

    public void addAction(IAction action){
        actions.add(action);
    }
    
    public void excute(IAction action){
        action.excute();
    }
    
    public void excutes(){
        for (IAction action:actions){
            action.excute();
        }
        actions.clear();
    }
}

测试:

package com.jdwa.command;

import java.util.ArrayList;
import java.util.List;

public class Controller {
    private List<IAction> actions = new ArrayList<>();

    public void addAction(IAction action){
        actions.add(action);
    }
    
    public void excute(IAction action){
        action.excute();
    }
    
    public void excutes(){
        for (IAction action:actions){
            action.excute();
        }
        actions.clear();
    }
}

结果:

正常播放。。。
====组合功能=====
拖动进度条。。。
暂停播放。。。
欢迎大家留言,以便于后面的人更快解决问题!另外亦欢迎大家可以关注我的微信公众号,方便利用零碎时间互相交流。共勉!

posted @ 2024-06-19 20:32  东方欲晓_莫道君行早  阅读(2)  评论(0编辑  收藏  举报