《Android源码设计模式解析与实战》读书笔记(十一)——命令模式

第十一章 让程序畅通执行——命令模式

1.定义

将一个请求封装成一个对象,让用户使用不同的请求把客户端参数化,对请求进行排队或者记录请求日志,并支持可撤销的操作。


2.使用场景

1).需要抽象出待执行的行为,然后以参数的形式提供出来时。

2).在不同的时刻指定、排列和执行请求时。

3).需要支持取消操作时。

4).支持修改日志功能,当系统崩溃时,这些修改可以被重做一遍时。

5).需要支持事务操作时。


3.简单实现

以一个俄罗斯方块游戏机为例,这个游戏机有“左移”,“右移”,“变换形状”,“快速下落”四个按键。

首先定义一个俄罗斯方块游戏机类:

public class TetrisMachine {
    public void up() {
        System.out.println("变换形状");
    }

    public void down() {
        System.out.println("快速下落");
    }

    public void left() {
        System.out.println("左移");
    }

    public void right() {
        System.out.println("右移");
    }
}

定义一个命令接口:

public interface Command {
    void execute();
}


然后是“左移”,“右移”,“变换形状”,“快速下落”四个命令的实现类:
public class LeftCommand implements Command {
    private TetrisMachine mTetrisMachine;

    public LeftCommand(TetrisMachine tetrisMachine) {
        this.mTetrisMachine = tetrisMachine;
    }

    @Override
    public void execute() {
        mTetrisMachine.left();
    }
}


public class RightCommand implements Command {
    private TetrisMachine mTetrisMachine;

    public RightCommand(TetrisMachine tetrisMachine) {
        this.mTetrisMachine = tetrisMachine;
    }

    @Override
    public void execute() {
        mTetrisMachine.right();
    }
}

public class UpCommand implements Command {
    private TetrisMachine mTetrisMachine;

    public UpCommand(TetrisMachine tetrisMachine) {
        this.mTetrisMachine = tetrisMachine;
    }

    @Override
    public void execute() {
        mTetrisMachine.up();
    }
}

public class DownCommand implements Command {
    private TetrisMachine mTetrisMachine;

    public DownCommand(TetrisMachine tetrisMachine) {
        this.mTetrisMachine = tetrisMachine;
    }

    @Override
    public void execute() {
        mTetrisMachine.down();
    }
}

接下来定义一个按键的类,存放了每一条命令实现类的实例,定义了调用每条命令的方法:

public class Buttons {
    private LeftCommand leftCommand;
    private RightCommand rightCommand;
    private UpCommand upCommand;
    private DownCommand downCommand;

    public Buttons(LeftCommand leftCommand, RightCommand rightCommand, UpCommand upCommand, DownCommand downCommand) {
        this.leftCommand = leftCommand;
        this.rightCommand = rightCommand;
        this.upCommand = upCommand;
        this.downCommand = downCommand;
    }

    public void left() {
        leftCommand.execute();
    }

    public void right() {
        rightCommand.execute();
    }

    public void up() {
        upCommand.execute();
    }

    public void down() {
        downCommand.execute();
    }
}

接下来就可以在客户端调用了:

        TetrisMachine mTetrisMachine = new TetrisMachine();
        Buttons buttons = new Buttons(new LeftCommand(mTetrisMachine)
                , new RightCommand(mTetrisMachine)
                , new UpCommand(mTetrisMachine)
                , new DownCommand(mTetrisMachine));

        buttons.left();
        buttons.right();
        buttons.up();
        buttons.down();


上面的例子不禁让我疑惑,明明可以直接调用的,却要做得很复杂:

        TetrisMachine mTetrisMachine = new TetrisMachine();
        mTetrisMachine.left();
        mTetrisMachine.right();
        mTetrisMachine.up();
        mTetrisMachine.down();

然后我释怀了,简单对于开发者是方便了,但是如果你突然不负责这个项目了,这样直接的调用,对于后面接手的开发者可不是那么好改的,牵一发而动全身,使用命令模式是为了简化逻辑而增加了操作。


4.总结

几乎所有的设计模式都有一个通病,就是类的增多,命令模式更是体现得淋漓尽致,但是为了解耦,这不可避免。

优点:

1).降低耦合性,提高可控性和可扩展性。

2).可以实现命令记录的功能,能方便的知道刚刚执行过哪些命令,并可在需要的时候恢复。

缺点:

1).会创建大量衍生的类。

Demo下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值