LoginSignup
3
1

More than 3 years have passed since last update.

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

はじめに

みんな大好きデザインパターンですが、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

では、良いお年を!!

3
1
0

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
  3. You can use dark theme
What you can do with signing up
3
1