《Android源码设计模式解析与实战》读书笔记(十一)——命令模式
来源:互联网 发布:国际象棋软件哪个好 编辑:程序博客网 时间:2024/05/22 00:33
第十一章 让程序畅通执行——命令模式
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
- 《Android源码设计模式解析与实战》读书笔记(十一)——命令模式
- 《Android源码设计模式解析与实战》读书笔记(二十一)——装饰者模式
- 《Android源码设计模式解析与实战》读书笔记(十一)
- 《Android源码设计模式解析与实战》读书笔记(二十一)
- 《Android源码设计模式解析与实战》读书笔记(二十一)
- 《Android源码设计模式解析与实战》读书笔记(二)——单例模式
- 《Android源码设计模式解析与实战》读书笔记(三)——建造者模式
- 《Android源码设计模式解析与实战》读书笔记(四)——原型模式
- 《Android源码设计模式解析与实战》读书笔记(五)——工厂方法模式
- 《Android源码设计模式解析与实战》读书笔记(七)——策略模式
- 《Android源码设计模式解析与实战》读书笔记(八)——状态模式
- 《Android源码设计模式解析与实战》读书笔记(九)——责任链模式
- 《Android源码设计模式解析与实战》读书笔记(十)——解释器模式
- 《Android源码设计模式解析与实战》读书笔记(六)——抽象工厂模式
- 《Android源码设计模式解析与实战》读书笔记(十二)——观察者模式
- 《Android源码设计模式解析与实战》读书笔记(十三)——备忘录模式
- 《Android源码设计模式解析与实战》读书笔记(十四)——迭代器模式
- 《Android源码设计模式解析与实战》读书笔记(十五)——模板方法模式
- 【C#编程学习笔记】MTK系统MMI的常用函数及宏定义
- 转载2——Android软键盘弹出时把布局顶上去的解决方法
- php使用fastcgi协议与php-fpm通信
- 关于SIGPIPE导致的程序退出
- 感知机
- 《Android源码设计模式解析与实战》读书笔记(十一)——命令模式
- iFunk执政官游戏本,不仅仅是游戏本
- python进程池multiprocessing.Pool和线程池multiprocessing.dummy.Pool实例
- FIO组数据测试脚本
- Lomper 每天进步一点点~~ QT学习之QString的arg方法
- 异步任务AsyncTask的简单理解
- 算法导论 红黑树(附带黑高度)
- 手把手教你申请邓白氏编码
- Android 搜索页-搜索历史条目动态添加(LinearLayout动态添加条目)