前言
大家好,我是练习两年半的Java练习生,最近阅读了《深入浅出设计模式(中文版)》,学习了各种设计模式,所以想出一个专栏和大家分享一下!
如果大家觉得文章还可以,欢迎关注点赞!后续还会陆续更新!!
一、定义
命令模式将“请求”封装成对象,以便使用不同的请求队列或者日志来参数化其他对象。命令模式也支持可撒销的操作。
二、类图
三、应用
3.1 需求
设计一个控制器,可以有几个按钮,并控制家里的各种不同的设备。(代码中为了方便只实现了一个按钮,同理,可以自行添加)。
3.2 分析
根据上面命令模式的类图,我们应该知道一个遥控器上面有很多的按钮,每个按钮对应的应该是一个命令的具体类,这个命令具体类知道如何让接收者进行必要的工作,同时,也提供了撤销该命令的方法。
3.3 实现
//定义一个命令接口,含有execute() 和 undo()方法
public interface Command {
void execute();
void undo();
}
//具体的设备,应该知道怎么处理
public class Light {
public void on(){
System.out.println("开灯");
}
public void off(){
System.out.println("关灯");
}
}
//具体的控制器,有开灯控制器、关灯控制器,可以实现undo操作
public class LightOffCommand implements Command{
Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.off();
}
@Override
public void undo() {
light.on();
}
}
//
public class LightOnCommand implements Command{
Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.on();
}
@Override
public void undo() {
light.off();
}
}
public class NoCommand implements Command{
@Override
public void execute() {
System.out.println("什么都不做,避免用null判断");
}
@Override
public void undo() {
}
}
//遥控器,用于控制设备
public class SimpleRemoteControl {
Command slot;
public void setSlot(Command slot) {
this.slot = slot;
}
public void buttonWasPressed(){
slot.execute();
}
}
// 用户使用时必须设置遥控器按钮
public class RemoteTest {
public static void main(String[] args) {
SimpleRemoteControl simpleRemoteControl = new SimpleRemoteControl();
Light light = new Light();
LightOnCommand lightOnCommand = new LightOnCommand(light);
simpleRemoteControl.setSlot(lightOnCommand);
simpleRemoteControl.buttonWasPressed();
}
}
四、问题
如何利用命令模式实现日志记录?
命令模式在java线程池在怎么使用?
命令模式对比观察者模式?
命令模式和观察者模式是两种不同的设计模式,它们的主要区别在于它们的目的和应用场景不同。
命令模式的目的是将请求封装为对象,从而使得请求的发送者和接收者解耦,实现了请求的发送者和接收者之间的松耦合关系。命令模式主要用于支持撤销操作、队列请求等功能,常常用于实现菜单、工具条、按钮等界面元素的事件处理。
而观察者模式的目的是在对象之间建立一对多的依赖关系,使得当一个对象状态改变时,所有依赖于它的对象都能够得到通知并自动更新。观察者模式主要用于实现事件处理、消息传递、状态同步等功能。
因此,命令模式和观察者模式的应用场景和目的不同,虽然它们都涉及到对象之间的通信,但是命令模式更注重请求的发送者和接收者之间的解耦,而观察者模式更注重对象之间的状态同步。
五、总结
以上就是今天要讲的内容,本文介绍了设计模式中的命令模式,其实这个模式在开发中是用得很多的一个模式,比如说线程池的实现,就是将一个个具体的命令对象封装成FutureTask对象,交给对应的线程池去调用。从而实现请求的发送者和接收者解耦。