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

从《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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值