设计模式——命令模式

1,540 阅读2分钟

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();
    }
}

运行结果:
image.png

3. 一些思考

上边的例子中把“投进两分球”和“投进三分球”这两个命令封装成了对象,科比和库里进球后,可以直接进行处理。如果裁判进行了改判,也可以很方便的进行回退。如果需要引入四分球,则只需要实现一个“投进四分球”的命令类即可。

参考引用

命令模式:www.runoob.com/design-patt…