Android设计模式-10-命令模式
2018-06-08 本文已影响56人
今阳说
1. 定义
- 将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;
- 对请求排队或者记录请求日志,以及支持可撤销的操作
- 是回调机制的一个面向对象的替代品,将行为调用者与实现者解耦
2. 使用场景
认为是命令的地方都可以使用命令模式,比如: 1. GUI 中每一个按钮都是一条命令。 2. 模拟 CMD
3. 优缺点
- 优点:
- 降低了系统耦合度
- 新的命令可以很容易添加到系统中去
- 缺点:
- 使用命令模式可能会导致某些系统有过多的具体命令类
4. 在Android源码中的使用
例如Android的事件机制中底层逻辑对事件的转发处理
5. 实例演示
以键盘的方向键对CS,贪吃蛇等游戏对控制命令为例
- 首先创建一个游戏基类
abstract class Game {
abstract void toLeft();
abstract void toRight();
abstract void toTop();
abstract void toBottom();
}
- 两个游戏的实现类,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 向下");
}
}
- 定义命令的抽象类
//命令者抽象,定义执行方法
public interface Command {
void execute();
}
- 上下左右四个命令的实现类
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();
}
}
- 命令的发起者,对应游戏机,电脑等按键触发的命令
//请求者类,命令由游戏机发起
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();
}
}
- 创建实例,进行命令的调用
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();
}