命令模式

一句话定义:

将一系列操作请求封装成一个命令对象,用户使用不同请求操作,支持记录、撤销等操作。

使用场景:

1.需要对行为进行记录、撤销或重做、事务等处理时
2.行为请求者与行为实现者通常是一种紧耦合的关系需要解耦时

实现要点:

1.定义三个角色:received:真正的命令执行对象;Command:命令;invoker 使用命令对象的入口
2.通过命令调用类调用接收者接收命令。调用者→接受者→命令
3.降低耦合度,新命令很容易扩展进去

情景假设:

开启、关闭  两个操作。
进行封装,并记录操作,使用命令模式。

实现步骤:

1. 创建请求类,完成具体的操作
/**
 * Created by ffengz.
 *
 * 具体的操作行为  请求类
 */
public class Operator {

    /**
     * 开启操作
     */
    public void turnOn(){
        Log.i("info", "trunOn: ==++ 开启" );
    }

    /**
     * 关闭操作
     */
    public void turnOff(){
        Log.i("info", "turnOff: ==++ 关闭");
    }
}
2. 创建命令接口类
/**
 * Created by ffengz.
 *
 * 命令接口
 */
public interface Command {

    /**
     * 命令执行
     */
    void execute();
}
3. 创建命令实体类,实现命令接口
/**
 * Created by ffengz.
 *
 * 命令实体类 开启动作
 */
public class TurnOnCommand implements Command {

    private Operator mInvoker;

    public TurnOnCommand(Operator invoker) {
        this.mInvoker = invoker;
    }

    @Override
    public void execute() {
        mInvoker.turnOn();
    }
}
/**
 * Created by ffengz.
 *
 * 命令实体类 关闭动作
 */
public class TurnOffCommand implements Command {

    private Operator mInvoker;

    public TurnOffCommand(Operator invoker) {
        this.mInvoker = invoker;
    }

    @Override
    public void execute() {
        mInvoker.turnOff();
    }
}
4. 封装命令调用者,提供调用入口,简单封装
/**
 * Created by ffengz.
 *
 * 命令调用者  封装命令 简单封装
 */
public class Invoker {
    private TurnOffCommand mTurnOff;
    private TurnOnCommand mTurnON;

    /**
     * 设置开启命令
     * @param command 开启命令
     */
    public void setTurnOnCommand(TurnOnCommand command){
        this.mTurnON = command;
    }

    /**
     * 设置关闭命令
     * @param command 关闭命令
     */
    public void setTurnOffCommand(TurnOffCommand command){
        this.mTurnOff = command;
    }

    /**
     * 执行开启命令
     */
    public void turnOn(){
        mTurnON.execute();
    }

    public void turnOff(){
        mTurnOff.execute();
    }
}
5. 封装命令调用者,提供调用入口,记录操作序列
/**
 * Created by ffengz.
 *
 * 命令调用者  封装命令 记录操作序列
 */
public class Invoker2 {
    // 命令列表
    private List<Command> commandList = Collections.synchronizedList(new ArrayList<Command>());

    /**
     * 添加新命令
     * @param command 新命令
     */
    public void add(Command command){
        commandList.add(command);
    }

    /**
     * 执行命令
     */
    public void execute(){
        if (commandList.size() > 0){
            for (Command c :
                    commandList) {
                c.execute();
            }
        }
    }

    /**
     * 记录
     */
    public void record(){
        if (commandList.size() > 0){
            for (Command c :
                    commandList) {
                if (c instanceof TurnOnCommand){
                    Log.i("info", "record: ==++ 开启动作" );
                }else if (c instanceof TurnOffCommand){
                    Log.i("info", "record: ==++ 关闭动作");
                }

            }
        }
    }
}
6. 调用命令
        // 命令模式
        Operator operator = new Operator();
        TurnOnCommand turnOnCommand = new TurnOnCommand(operator);
        TurnOffCommand turnOffCommand = new TurnOffCommand(operator);

        // 简单方式
        Invoker invoker = new Invoker();
        invoker.setTurnOnCommand(turnOnCommand);
        invoker.setTurnOffCommand(turnOffCommand);
        invoker.turnOn();
        invoker.turnOff();

        // 操作记录序列保存
        Invoker2 invoker2 = new Invoker2();
        invoker2.add(turnOnCommand);
        invoker2.add(turnOnCommand);
        invoker2.add(turnOffCommand);
        invoker2.execute();
        invoker2.record();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值