行为型设计模式之命令模式

Posted 丨Jack_Chen丨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行为型设计模式之命令模式相关的知识,希望对你有一定的参考价值。

@TOC

命令模式

应用场景

适用场景:

1、只要认为是命令的地方都可以使用命令模式

2、请求调用者和请求的接收者需要解耦,使得调用者和接收者不直接交互

3、需要抽象出等待执行的行为,比如播放操作、暂定操作等

4、需要支持命令宏,即命令组合操作

生活中的应用场景比如:遥控器,播放器,点餐系统。

优缺点

优点:

1.通过引入中间件(抽象接口),解耦了命令请求与实现。

2.扩展性良好,可以很容易地增加新命令。

3.支持组合命令,支持命令队列。

4.可以在现有命令的基础上,增加额外功能。

缺点:

1.具体命令类可能过多。

2.命令模式的结果其实就是接收方的执行结果,但是为了以命令的形式进行架构,解耦请求与实现,引入了额外类型结构,增加了理解上的困难

主要角色

1.接收者角色(Receiver)

2.命令角色(Command)

3.具体命令角色ConcreteCommand)

4.请求者角色(Invoker)

命令模式的基本使用

创建接收者角色

接收者角色负责具体实施或执行一个请求。

public class Receiver 
    public void action() 
        System.out.println("接收者Receiver执行action操作");
    

创建命令角色

命令角色定义需要执行的所有命令行为,它作为接收者角色和请求者角色的中间件,解耦彼此。

public interface ICommand 
    void execute();

具体命令角色

具体命令角色内部维护一个接收者Receiver,在其execute()方法中调用接收者Receiver的相关方法。

public class ConcreteCommand implements ICommand 
    // 直接创建接收者,不暴露给客户端
    private Receiver mReceiver = new Receiver();

    public void execute() 
        this.mReceiver.action();
    

请求者角色

请求者角色接收客户端的命令,并执行命令。

public class Invoker 
    private ICommand mCmd;

    public Invoker(ICommand cmd) 
        this.mCmd = cmd;
    

    public void action() 
        this.mCmd.execute();
    

客户端执行

    public static void main(String[] args) 
        ICommand cmd = new ConcreteCommand();
        Invoker invoker = new Invoker(cmd);
        invoker.action();
    
接收者Receiver执行action操作

命令模式实现播放器功能

创建接收者角色

public class Player 
    public void play()
        System.out.println("执行播放操作");
    
    public void stop()
        System.out.println("执行暂停播放操作");
    

创建命令角色

public interface IAction 
    void execute();

具体命令角色

创建播放器可以接受的播放指令

public class PlayAction implements IAction 
    // 直接创建接收者,不暴露给客户端
    private Player player;

    public PlayAction(Player player) 
        this.player = player;
    

    public void execute() 
        player.play();
    

创建播放器可以接受的暂停指令

public class StopAction implements IAction 
    private Player player;

    public StopAction(Player player) 
        this.player = player;
    

    public void execute() 
        player.stop();
    

创建请求者角色

创建控制器,类似控制面板,执行上面提供的功能即可。如此控制器就与播放器进行解耦了,如新增指令则执行新增命令即可,无需修改控制器。

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

    public void addAction(IAction action) 
        actions.add(action);
    

    public void execute(IAction action) 
        action.execute();
    

    public void executes() 
        for (IAction action : actions) 
            action.execute();
        
        actions.clear();
    

客户端执行

    public static void main(String[] args) 
        // 创建一个播放器
        Player player = new Player();
        Controller controller = new Controller();
        // 单个命令执行
        controller.execute(new StopAction(player));
        System.out.println("------------------");
        // 批量执行命令
        controller.execute(new PlayAction(player));
        controller.addAction(new StopAction(player));
        controller.executes();
    
执行暂停播放操作
------------------
执行播放操作
执行暂停播放操作

以上是关于行为型设计模式之命令模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式----行为型模式之命令模式(Command Pattern)

设计模式之命令模式(行为型)

设计模式之命令模式(行为型)

设计模式之行为类模式PK

Java设计模式之八 ----- 责任链模式和命令模式

Java进阶篇设计模式之八 ----- 责任链模式和命令模式