设计模式(23)-----命令模式

Posted 韩思明

tags:

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

命令模式(command)

定义

  将一个请求封装成为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

UML类图

角色

  Command:定义命令的统一接口

  ConcreteCommand:Command接口的实现者,用来执行具体的命令,某些情况下可以直接用来充当Receiver。

  Receiver:命令的实际执行者

  Invoker:命令的请求者,是命令模式中最重要的角色。这个角色用来对各个命令进行控制。

例子

  电视机功能接口类

package com.csdhsm.designpattem.command;

/**  
 * @Title:  ITV.java   
 * @Description: 电视机功能接口
 * @author: Han   
 * @date:   2016年6月29日 下午5:07:10   
 */  
public interface ITV {
    
    //开机
    public void turnOn();
    
    //关机
    public void turnOff();
    
    //增大音量
    public void increaseVolume();
}

  电视机实现类

package com.csdhsm.designpattem.command;

/**  
 * @Title:  TV.java   
 * @Description: 电视机实现类
 * @author: Han   
 * @date:   2016年6月29日 下午5:07:31   
 */  
public class TV implements ITV{

    @Override
    public void turnOn() {
        System.out.println("电视机打开了!");
    }

    @Override
    public void turnOff() {
        System.out.println("电视机关闭了!");
    }

    @Override
    public void increaseVolume() {
        System.out.println("增大电视机的音量!");
    }
}

  命令抽象类

package com.csdhsm.designpattem.command;

/**  
 * @Title:  Command.java   
 * @Description: 命令抽象类
 * @author: Han   
 * @date:   2016年6月29日 下午5:09:30   
 */  
public abstract class Command {
    
    protected ITV tv;

    public Command(ITV tv) {
        this.tv = tv;
    }
    
    //命令执行方法
    public abstract void execute();
}

  三个具体命令实现类,分别是开机,关机,增大音量

package com.csdhsm.designpattem.command;

/**  
 * @Title:  TurnOn.java   
 * @Description: 打开电视命令类
 * @author: Han   
 * @date:   2016年6月29日 下午5:08:29   
 */  
public class TurnOn extends Command {

    public TurnOn(ITV tv) {
        super(tv);
    }

    @Override
    public void execute() {
        this.tv.turnOn();
    }
}
package com.csdhsm.designpattem.command;

/**  
 * @Title:  TurnOff.java   
 * @Description: 关闭电视命令 
 * @author: Han   
 * @date:   2016年6月29日 下午5:07:42   
 */  
public class TurnOff extends Command {

    public TurnOff(ITV tv) {
        super(tv);
    }

    @Override
    public void execute() {
        this.tv.turnOff();
    }
}
package com.csdhsm.designpattem.command;

/**  
 * @Title:  IncreaseVolume.java   
 * @Description: 增加音量命令类
 * @author: Han   
 * @date:   2016年6月29日 下午5:07:54   
 */  
public class IncreaseVolume extends Command {

    public IncreaseVolume(ITV tv) {
        super(tv);
    }

    @Override
    public void execute() {
        this.tv.increaseVolume();
    }
}

  控制类,在命令模式里充当着Invoker的角色

package com.csdhsm.designpattem.command;

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

/**  
 * @Title:  Control.java   
 * @Description: 控制类,可以想象成遥控器,管理了一个命令集合
 * @author: Han   
 * @date:   2016年6月29日 下午5:08:47   
 */  
public class Control {
    
    //命令集合
    private List<Command> orders;
    
    public Control() {
        orders = new ArrayList<>();
    }
    
    public void setOrder(Command command) {
        orders.add(command);
    }
    
    //执行命令集合里的所有命令
    public void executeOrders() {
        for (Command command : orders) {
            command.execute();
        }
    }
}

  客户端

package com.csdhsm.designpattem.command;

public class Solution {
    public static void main(String[] args) {
        ITV tv = new TV();
        Command on = new TurnOn(tv);
        Command off = new TurnOff(tv);
        Command add = new IncreaseVolume(tv);
        Control control = new Control();
        control.setOrder(on);
        control.setOrder(add);
        control.setOrder(off);
        control.executeOrders();
    }
}

  结果

  OK,成功!

总结

  1. 命令模式是通过命令发送者和命令执行者的解耦来完成对命令的具体控制的。

  2. 命令模式是对功能方法的抽象,并不是对对象的抽象。

  3. 命令模式是将功能提升到对象来操作,以便对多个功能进行一系列的处理以及封装。

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

16-命令(Command)模式Ruby实现

FragmentStatePageAdapter 缓存,重新创​​建活动后如何引用旧片段? (对于前 - 横向模式)

Java中23种设计模式(附代码样例)

命令模式

Java中23种设计模式--超快速入门及举例代码

java设计模式-----23命令模式