1. 命令模式概述
命令模式是一种数据驱动的设计模式。
请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
(1) 适用情况
将请求或行为封装为一个对象来处理,就可以实现请求者与实现者的松耦合。这样在进行记录、撤销等处理时,就很方便。
(2) 优点
降低系统耦合,容易增加新的命令。
(3) 缺点
可能会导致系统中有过多的命令类。
2. 命令模式实例
这里利用命令模式,模拟NBA球员得分的过程。
(1) 实现抽象类Score
public abstract class Score {
int point;
}
(2) 实现两分球和三分球类
public class TwoPointer extends Score {
public TwoPointer() {
point = 2;
}
}
public class ThreePointer extends Score {
public ThreePointer() {
point = 3;
}
}
(3) 实现球员类
public class Player {
private String name;
private int total;
public Player(String name) {
this.name = name;
this.total = 0;
}
/**
* 总得分
*/
public void getTotal() {
System.out.println(name + "目前得分:" + total);
}
/**
* 进球
*/
public void score(Score score) {
System.out.println(name + "投进了一个" + score.point + "分球。");
total += score.point;
}
/**
* 计分错了,去掉得分
*/
public void undo(Score score) {
System.out.println(name + "之前投进的一个" + score.point + "分球无效。");
total -= score.point;
}
}
(4) 比赛开始
public class Game {
public static void main(String[] args) {
Player kobe = new Player("科比");
Player curry = new Player("库里");
// 两分球
TwoPointer twoPointer = new TwoPointer();
// 三分球
ThreePointer threePointer = new ThreePointer();
// 科比投进两分球
kobe.score(twoPointer);
kobe.getTotal();
// 库里投进三分球
curry.score(threePointer);
curry.getTotal();
// 刚才库里踩线了,应该是个两分,需要撤销后重新记分
curry.undo(threePointer);
curry.score(twoPointer);
curry.getTotal();
}
}
运行结果:
3. 一些思考
上边的例子中把“投进两分球”和“投进三分球”这两个命令封装成了对象,科比和库里进球后,可以直接进行处理。如果裁判进行了改判,也可以很方便的进行回退。如果需要引入四分球,则只需要实现一个“投进四分球”的命令类即可。