北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

Rhino事始め - JavaとRhinoのコラボ(3)

長いので2回続きとなります。今回は準備だけ。

3. Javaのインタフェースを実装する

interfaceを扱うJavaフレームワーク内に、JavaScriptで実装したインスタンスを流すと言うRhinoの利用法です。Javaフレームワークは堅固な開発ができると同時に、JavaScriptの実装部はコンパイルなしで自由に変えられるので、大変便利です。


今回は、Chefに料理を作らせて対決させると言う想定のフレームワークを作ってみます。まずは、フレームワーク内を流すinterfaceを定義します。自己紹介と、焼く、煮る、切る、そして仕上げを実行することができるインタフェースです。

package jstest;

public interface Chef {
    public void introduce();
    public void fry(String food);
    public void boil(String food);
    public void cut(String food);
    public void finish();
}


これは後からJavaScriptで実装しますが、イメージがわかりやすいようにJavaの実装も用意しておきます。

class JavaChef implements Chef{
    public void introduce() {
        System.out.println("Javaさんの出番です。");
    }

    public void boil(String food) {
        System.out.println(food + "をボイルした。");
    }

    public void cut(String food) {
        System.out.println(food + "をカットした。");
    }

    public void fry(String food) {
        System.out.println(food + "を焼いた。");
    }

    public void finish() {
        System.out.println("完成した。");
    }


このシェフに働いてもらう台所を作成します。今回はカレーとミートソースをシェフ達に作ってもらいます。

package jstest;

import java.util.ArrayList;

public class Kitchen {
    private final ArrayList<Chef> chefs;

    public Kitchen(ArrayList<Chef> chefs){
        this.chefs = chefs;
    }

    public void run(){
        System.out.println("【カレー対決】");
        for(Chef chef : chefs){
            makeCurry(chef);
            System.out.println();
        }

        System.out.println("【ミートソース対決】");
        for(Chef chef : chefs){
            makeBolognese(chef);
            System.out.println();
        }
    }

    public void makeCurry(Chef chef){
        chef.introduce();
        chef.cut("じゃがいも、豚肉");
        chef.fry("じゃがいも、豚肉");
        chef.boil("ルー、じゃがいも、豚肉");
        chef.finish();
    }

    public void makeBolognese(Chef chef){
        chef.introduce();
        chef.boil("パスタ");
        chef.cut("たまねぎ");
        chef.fry("トマトソース、挽肉、たまねぎ");
        chef.finish();
    }
}

*1


テストとして、以下のようなメインルーチンを作って実行してみます。

    public static void main(String[] args) throws Exception {
            ArrayList<Chef> chefs = new ArrayList<Chef>();
            chefs.add(new JavaChef());

            Kitchen kitchen = new Kitchen(chefs);
            kitchen.run();
    }

[結果]
【カレー対決】
Javaさんの出番です。
じゃがいも、豚肉をカットした。
じゃがいも、豚肉を焼いた。
ルー、じゃがいも、豚肉をボイルした。
完成した。

【ミートソース対決】
Javaさんの出番です。
パスタをボイルした。
たまねぎをカットした。
トマトソース、挽肉、たまねぎを焼いた。
完成した。


これでフレームワークは完成です。長いので次のエントリに続きます。

*1:例外処理は適当ですよ