命令模式:将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
用到的原则:
1、封装变化
2、组合优于继承
3、针对接口编程,不能针对实现编程
4、解耦
5、类对修改关闭,对扩展开放
6、依赖抽象,不依赖具体
命令模式很好理解,直接看代码
interface Commend { public void execute(); } class Light { public void on() { System.out.println("light on"); } public void off() { System.out.println("light off"); } } class LintOnCommend implements Commend { Light light; public LintOnCommend(Light light) { this.light = light; } @Override public void execute() { light.on(); } } class SimpleRemoteControl { Commend commend; public SimpleRemoteControl() {} public void setCommend(Commend commend) { this.commend = commend; } public void buttonWasPressed() { commend.execute(); } } public class Test { public static void main(String[] args) { SimpleRemoteControl control = new SimpleRemoteControl(); Light light = new Light(); LintOnCommend onCommend = new LintOnCommend(light); control.setCommend(onCommend); control.buttonWasPressed(); } }
类图
命令模式主要就是让类具有单一权责,每个类只干自己的事,不关心具体的类型。就像SimpleRemoteControl中,只需要给它一名命令就去执行,不管这个命令的具体类型是什么。
还有要说的是设计技巧,也就是需要好好理解一下类图。
书中第六章还有更加高大上的例子,简单的实现了遥控器的实现原理还有回到上一个命令的方法。也有将一组命令组合到一个命令的方法,然后利用这个原理可以实现队列请求,日志请求。我只是学习一下设计模式,并没有打算把整个书抄下来。