从《Java 8函数式编程》看到的一个例子。
命令者模式中分为4个角色:
- 命令接受者:负责执行实际任务
- 命令者:封装了所有命令执行者的信息
- 发起者:控制一个或多个命令的顺序和执行
- 客户端:创建具体命令执行
例:文本编辑器
- Editor: 命令接受者
- Action: 命令者
- Macro(宏): 发起者
- Client: 客户端
public interface Editor {//文件编辑器接口
public void save();
public void open();
public void close();
}
public class EditorImpl implements Editor { //具体文件编辑器
@Override
public void save() {
System.out.println("save");
}
@Override
public void open() {
System.out.println("open");
}
@Override
public void close() {
System.out.println("close");
}
}
public interface Action {//所有的操作均实现Action接口
public void perform();
}
public class Open implements Action{//具体的命令类,代理save操作
private final Editor editor;
public Open(Editor editor) {
this.editor = editor;
}
@Override
public void perform() {
editor.open();
}
}
public class Open implements Action{//具体的命令类,代理open操作
private final Editor editor;
public Open(Editor editor) {
this.editor = editor;
}
@Override
public void perform() {
editor.open();
}
}
public class Close implements Action{//具体的命令类,代理close操作
private final Editor editor;
public Close(Editor editor) {
this.editor = editor;
}
@Override
public void perform() {
editor.close();
}
}
public class Client { //运行宏的客户端
public static void main(String[] args) {
new Client().run1();
}
public void run1() { //最原始的方法
EditorImpl editor = new EditorImpl();//通常可以通过Spring框架注入
Macro macro = new Macro();
macro.record(new Open(editor));
macro.record(new Save(editor));
macro.record(new Close(editor));
macro.run();
}
public void run2() { //最原始的方法
EditorImpl editor = new EditorImpl();//通常可以通过Spring框架注入
Macro macro = new Macro();
macro.record(() -> editor.open());//用Lamblda表达式替换原来的代理类Open
macro.record(() -> editor.save());//用Lamblda表达式替换原来的代理类Save
macro.record(() -> editor.close());//用Lamblda表达式替换原来的代理类Cloese
macro.run();
}
public void run3() { //更加简洁
EditorImpl editor = new EditorImpl();//通常可以通过Spring框架注入
Macro macro = new Macro();
macro.record(editor::open);
macro.record(editor::save);
macro.record(editor::close);
macro.run();
}
}