利用Lambda表达式简化命令者模式

来源:互联网 发布:中国民生网络电视台 编辑:程序博客网 时间:2024/05/16 00:45

从《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();    }}
1 0