エキサイト株式会社メディア開発の佐々木です。
はじめに
みんな大好きデザインパターンですが、Java8から導入されたLambda式により、簡素にかけるようになるので、今更ですが紹介です。
command pattern (従来)
コマンドパターンは下記のように書きます。FileActionのインターフェース
public interface FileAction {
void openFile();
void writeFile();
void closeFile();
}
public interface Command {
void execute();
}
public class OpenFile implements Command {
private final FileAction FileAction;
public OpenFile(FileAction fileAction) {
this.fileAction = fileAction;
}
@Override
public void execute() {
fileAction.openFile();
}
}
public class CloseFile implements Command {
private final FileAction FileAction;
public CloseFile(FileAction fileAction) {
this.fileAction = fileAction;
}
@Override
public void execute() {
fileAction.closeFile();
}
}
public class WriteFile implements Command {
private final FileAction FileAction;
public WriteFile(FileAction fileAction) {
this.fileAction = fileAction;
}
@Override
public void execute() {
fileAction.writeFile();
}
}
public class Macro {
private final List<Runnable> commands;
public Macro(){
this.commands = new ArrayList<>();
}
public void record(Command command) {
this.commands.add(command);
}
public void run(){
this.commands.forEach(e -> {
e.execute();
});
}
}
3つのコマンドを発行するだけなんですが、Command
インターフェースをそれぞれに実装する必要があり、結構面倒です。これを部分的にJava:Lambdaで書き換えると、スッキリかけます。
command pattern (Lambda式)
public class FileActionImpl implements FileAction {
@Override
public void openFile() {
System.out.println("open");
}
public void writeFile() {
System.out.println("write");
}
@Override
public void closeFile() {
System.out.println("close");
}
}
FileActionインターフェースを実装したクラスを作成し、そこにメソッドを集めます。(ここではわかりやすいように標準出力しているだけです)
Macro macro = new Macro();
FileActionImpl action = new FileActionImpl();
macro.record(() -> action.openFile());
macro.record(() -> action.writeFile());
macro.record(() -> action.closeFile());
macro.execute();
上記のように、呼び出し側でLambda式でそれぞれ何をさせたいかを書きます。
これで、 executeを実行したタイミングで実行されます。
1操作1ファイルみたいな感じになってないので、省力化したいときには便利かと思います。
最後に
Java8がリリースされて、もう6年。早いものです。意外とLambda式に最適化されたデザインパターンというのがあんまり見られないので、書いてみました。
エキサイトはエンジニアを募集しております。ご連絡お待ちしております。
https://www.wantedly.com/projects/529139
では、良いお年を!!