您的位置:首页 > 其它

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

2016-06-06 12:33 447 查看
从《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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: