本文主要内容
- 命令模式说明
- 命令模式示例
1、命令模式说明
命令模式,将请求封装成为对象,以便使用不同的请求、队列或者日志来参数化其他对象,命令模式也可以撤销操作。
假设现有一个遥控器,可以编程,自定义功能。现在我们需要用遥控器来实现电灯的开关。我们当然可以在遥控器的代码中加很多if
,实现开关电灯。但仔细想一想,电灯可能有很多品种,它们的具体实现可能有不同,如果要更换电灯,那就需要更改遥控器的代码。同时,遥控器是可编程的,今天这个按钮是控制电灯的,明天它可能要去控制电视机了,怎么办呢?面对这种不确定的情况,就是要面向抽象接口编程,使用命令模式,将命令请求与命令的接收者解耦才行。
2、命令模式示例
public interface Command {
//命令接口
public void execute();
}
public class LightCommand implements Command{
private Action mAction;
@Override
public void execute() {
mAction.action();
}
public void setAction(Action action){
mAction = action;
}
}
public interface Action {
public void action();
}
public class Light implements Action{
@Override
public void action(){
System.out.println("开灯");
}
}
public class Main {
public static void main(String[] args) {
Action action = new Light();
LightCommand command = new LightCommand();
command.setAction(action);
command.execute();
}
}
代码比较简单,我就不再详细说明了。
其实在工作中,设计模式的应用是无所不在的。很多人在刚开始学习设计模式的时候,觉得学这东西哪天能用上呢?当自己开发新的需求,或者重构的时候,我经常会想这个地方应该怎么写更合理,怎么写更加容易扩展,怎么写代码更优雅,这就是设计模式的应用,虽然不至于说,一看到某个地方就想到用哪个设计模式,但这也是我们开始思索架构的开始。
回想这么多的设计模式,工作中遇到难题,想不出用啥设计模式不要紧,学习这东西不能拘泥于形式。但我们记得一条就好,不要面向对象了,面向抽象编程就可以。比如说遥控器这个示例,其中一共有两个不确定点:
- 电灯的种类不同,开关实现会有不同
- 遥控器的按键可编程,可能会更改用途
有一个不确定点,那就是一个抽象点,一个接口或者说基类。提出取这些接口,剩下的不就水到渠成了吗?
网友评论