android设计模式—命令设计模式

  • 定义:
    将请求封装成一个对象,从而让用户使用不同的请求吧客户端参数化。请求排队或者记录请求日志,以及支持可撤销的操作。

  • 模式的使用场景:

	1.系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
	2.系统需要在不同的时间指定请求、将请求排队和执行请求。
	3.系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
	4.系统需要将一组操作组合在一起。
  • 角色:
	Command命令角色  :定义命令的接口,声明具体命令类需要执行的方法。这是一个抽象角色。
	
	ConcreteCommand具体命令角色:命令接口的具体实现对象,通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
	
	Invoker请求者角色:负责调用命令对象执行请求,通常会持有命令对象(可以持有多个命令对象)。Invoker是Client真正触发命令并要求命令执行相应操作的地方(使用命令对象的入口)。
  • 优点

    更弱的耦合性,更灵活的控制性以及更好的扩展性

  • 缺点

    类膨胀,大量衍生类的创建。在业务逻辑更改的情况下可能起到反作用

代码案例

  • 命令抽象
/**
 * Created by Administrator on 2019/3/6 0006.
 * 命令抽象
 */

public interface Command {
    /**
     * 执行命令
     */
    void execute();

    /**
     * 休息
     */
    void sleep();
}

  • 具体命令角色
/**
 * Created by Administrator on 2019/3/6 0006.
 * <p>
 * 具体命令角色:
 * <p>
 * 进攻命令
 */

public class AttachCommand implements Command {
    private Army army;

    public AttachCommand(Army army) {
        this.army = army;
    }

    @Override
    public void execute() {
        army.attack();
    }

    @Override
    public void sleep() {
        army.sleep();
    }

}
/**
 * Created by Administrator on 2019/3/6 0006.
 * <p>
 * 具体命令角色:
 * <p>
 * 取消进攻命令
 */

public class CancelCommand implements Command {
    private Army army;

    public CancelCommand(Army army) {
        this.army = army;
    }

    @Override
    public void execute() {
        army.cancel();
    }

    @Override
    public void sleep() {
        army.sleep();
    }

}
  • 命令的接收者,负责具体执行请求

/**
 * Created by Administrator on 2019/3/6 0006.
 * 命令的接收者,负责具体执行请求
 * <p>
 * 军队
 */

public class Army {
    public void attack() {
        Log.d("huangxiaoguo","进攻———————————————>");
    }

    public void sleep() {
        Log.d("huangxiaoguo","就地扎营———————————————>");
    }
    public void cancel() {
        Log.d("huangxiaoguo","取消进攻———————————————>");
    }
}
  • 调用
		Army army = new Army();
        AttachCommand attachCommand = new AttachCommand(army);
        CancelCommand cancelCommand = new CancelCommand(army);
        attachCommand.execute();
        attachCommand.sleep();
        cancelCommand.execute();
        cancelCommand.sleep();

android设计模式—命令设计模式

  • 当然你也可以创建一个具体执行者去执行命令
/**
 * Created by Administrator on 2019/3/6 0006.
 * 具体执行者,来执行命令
 */

public class General {

    private Command cancelCommand;
    private Command attachCommand;


    public General() {
        Army army = new Army();
        attachCommand = new AttachCommand(army);
        cancelCommand = new CancelCommand(army);

    }

    public void attach() {
        attachCommand.execute();
    }

    public void cancel() {
        cancelCommand.execute();
    }
}
  • 执行命令
 		General general = new General();
        general.attach();
        general.cancel();

android设计模式—命令设计模式

上一篇:题解:Saruman's Army(贪心)


下一篇:Mondriaan's Dream - POJ 2411(状态压缩)