Android设计模式

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

2018-06-08  本文已影响56人  今阳说

1. 定义

2. 使用场景

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

3. 优缺点

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();
    }
上一篇 下一篇

猜你喜欢

热点阅读