美文网首页Android设计模式
Android设计模式-10-命令模式

Android设计模式-10-命令模式

作者: 今阳说 | 来源:发表于2018-06-08 19:55 被阅读56次

1. 定义

  • 将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;
  • 对请求排队或者记录请求日志,以及支持可撤销的操作
  • 是回调机制的一个面向对象的替代品,将行为调用者与实现者解耦

2. 使用场景

认为是命令的地方都可以使用命令模式,比如: 1. GUI 中每一个按钮都是一条命令。 2. 模拟 CMD

3. 优缺点

  • 优点:
    1. 降低了系统耦合度
    2. 新的命令可以很容易添加到系统中去
  • 缺点:
    • 使用命令模式可能会导致某些系统有过多的具体命令类

4. 在Android源码中的使用

例如Android的事件机制中底层逻辑对事件的转发处理

5. 实例演示

以键盘的方向键对CS,贪吃蛇等游戏对控制命令为例

  1. 首先创建一个游戏基类
abstract class Game {
        abstract void toLeft();

        abstract void toRight();

        abstract void toTop();

        abstract void toBottom();
    }
  1. 两个游戏的实现类,cs 和贪吃蛇
 //接收者角色,CS游戏
    class CS extends Game {
        //游戏方法的具体实现
        @Override
        void toLeft() {
            LjyLogUtil.i("cs 向左走");
        }

        @Override
        void toRight() {
            LjyLogUtil.i("cs 向右走");
        }

        @Override
        void toTop() {
            LjyLogUtil.i("cs 跳起");
        }

        @Override
        void toBottom() {
            LjyLogUtil.i("cs 蹲下");
        }
    }

    //接收者角色,贪吃蛇游戏
    class Snake extends Game {
        //游戏方法的具体实现
        @Override
        void toLeft() {
            LjyLogUtil.i("Snake 向左");
        }

        @Override
        void toRight() {
            LjyLogUtil.i("Snake 向右");
        }

        @Override
        void toTop() {
            LjyLogUtil.i("Snake 向上");
        }

        @Override
        void toBottom() {
            LjyLogUtil.i("Snake 向下");
        }
    }
  1. 定义命令的抽象类
//命令者抽象,定义执行方法
    public interface Command {
        void execute();
    }
  1. 上下左右四个命令的实现类
 public static class LeftCommand implements Command {
        //游戏对象的引用
        private Game machine;

        public LeftCommand(Game machine) {
            this.machine = machine;
        }

        @Override
        public void execute() {
            machine.toLeft();
        }
    }

    public static class RightCommand implements Command {
        //游戏对象的引用
        private Game machine;

        public RightCommand(Game machine) {
            this.machine = machine;
        }

        @Override
        public void execute() {
            machine.toRight();
        }
    }

    public static class TopCommand implements Command {
        //游戏对象的引用
        private Game machine;

        public TopCommand(Game machine) {
            this.machine = machine;
        }

        @Override
        public void execute() {
            machine.toTop();
        }
    }

    public static class BottomCommand implements Command {
        //游戏对象的引用
        private Game machine;

        public BottomCommand(Game machine) {
            this.machine = machine;
        }

        @Override
        public void execute() {
            machine.toBottom();
        }
    }
  1. 命令的发起者,对应游戏机,电脑等按键触发的命令
    //请求者类,命令由游戏机发起
    public class GameMachine {
        private LeftCommand mLeftCommand;
        private RightCommand mRightCommand;
        private TopCommand mTopCommand;
        private BottomCommand mBottomCommand;

        public void initWithGame(Game game) {
            setLeftCommand(new LeftCommand(game));
            setRightCommand(new RightCommand(game));
            setTopCommand(new TopCommand(game));
            setBottomCommand(new BottomCommand(game));
        }

        public void setLeftCommand(LeftCommand leftCommand) {
            mLeftCommand = leftCommand;
        }

        public void setRightCommand(RightCommand rightCommand) {
            mRightCommand = rightCommand;
        }

        public void setTopCommand(TopCommand topCommand) {
            mTopCommand = topCommand;
        }

        public void setBottomCommand(BottomCommand bottomCommand) {
            mBottomCommand = bottomCommand;
        }

        public void toLeft() {
            mLeftCommand.execute();
        }

        public void toRight() {
            mRightCommand.execute();
        }

        public void toTop() {
            mTopCommand.execute();
        }

        public void toBottom() {
            mBottomCommand.execute();
        }
    }
  1. 创建实例,进行命令的调用
 private void methodICommandPattern() {
        //以CS游戏,贪吃蛇游戏为例
        //开闭原则
        GameMachine btn = new GameMachine();
        CS cs = new CS();
        btn.initWithGame(cs);
        //执行命令
        btn.toLeft();
        btn.toRight();
        btn.toTop();
        btn.toLeft();
        btn.toBottom();
        btn.toRight();
        Snake snake = new Snake();
        btn.initWithGame(snake);
        //执行命令
        btn.toLeft();
        btn.toRight();
        btn.toTop();
        btn.toLeft();
        btn.toBottom();
        btn.toRight();
    }

相关文章

  • Android设计模式-10-命令模式

    1. 定义 将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化; 对请求排队或者记录请求日志,以及支...

  • Android设计模式-10-命令模式

    1. 定义 将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化; 对请求排队或者记录请求日志,以及支...

  • Android 命令模式

    Android 设计模式系列文章 Android 23种设计模式 前言 命令模式,多被用于程序菜单命令。比如遥控器...

  • Android 设计模式之简单工厂模式

    设计模式系列文章 Android 设计模式之单例模式 Android 设计模式之Builder模式 Android...

  • 【设计模式Android】中介者模式

    设计模式Android 其他相关文章:【设计模式Android】设计模式六大原则【设计模式Android】代理模式...

  • 设计模式详解——适配器模式

    本篇文章介绍一种设计模式——命令模式。本篇文章内容参考《JAVA与模式》之适配器模式,Android设计模式源码解...

  • 行为模式10-行为模式总结

    行为模式10-行为模式总结 行为模式总共有11个设计模式: 观察者模式(Observer) 中介者模式(Media...

  • Android设计模式-命令模式

    UML关系简单介绍UML简单使用的介绍创建型设计模式Android设计模式-单例模式Android设计模式-工厂模...

  • Android 设计模式 - 命令模式

    命令模式:将一个请求封装为一个对象,从而使我们可以用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支...

  • Android设计模式:命令模式

    命令模式 简介:通过command抽象命令类,将不符合抽象编程的handler,转为抽象编程。 背景 购物商城的应...

网友评论

    本文标题:Android设计模式-10-命令模式

    本文链接:https://www.haomeiwen.com/subject/kytzsftx.html