LoginSignup
1

More than 1 year has passed since last update.

posted at

Java Lambda Command Pattern

エキサイト株式会社メディア開発の佐々木です。

はじめに

みんな大好きデザインパターンですが、Java8から導入されたLambda式により、簡素にかけるようになるので、今更ですが紹介です。

command pattern (従来)

コマンドパターンは下記のように書きます。FileActionのインターフェース

FileAction.java
public interface FileAction {
    void openFile();
    void writeFile();
    void closeFile();
}
Command.java
public interface Command {
    void execute();
}
OpenFile.java
public class OpenFile implements Command {
    private final FileAction FileAction;

    public OpenFile(FileAction fileAction) {
        this.fileAction = fileAction;
    }

    @Override
    public void execute() {
        fileAction.openFile();
    }
}
CloseFile.java
public class CloseFile implements Command {
    private final FileAction FileAction;

    public CloseFile(FileAction fileAction) {
        this.fileAction = fileAction;
    }

    @Override
    public void execute() {
        fileAction.closeFile();
    }
}
WriteFile.java
public class WriteFile implements Command {
    private final FileAction FileAction;

    public WriteFile(FileAction fileAction) {
        this.fileAction = fileAction;
    }

    @Override
    public void execute() {
        fileAction.writeFile();
    }
}
Macro.java
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式)

FileActionImpl.java
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

では、良いお年を!!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1