ababup1192
3/9/2017 - 12:18 PM

Adder.java

// ユーザが掛け算の二項演算を自由に定義し拡張
public class Multiplier implements BinaryOperator {
    public int apply(int x, int y){
        return x * y;
    }
}
// ユーザには、この二項演算の為のインターフェースだけが公開される。
public interface BinaryOperator {
    public int apply(int x, int y);
}
import java.util.Scanner;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.util.List;
import java.util.ArrayList;

// 二項演算シミュレータ。一部だけをユーザに公開
public class BinaryOperationSimulator {
    private int x;
    private int y;
    private List<BinaryOperator> operators;

    // 計算手順。これはシミュレータが提供する。ユーザには触らせない。
    public BinaryOperationSimulator(){
        operators = new ArrayList<>();

        inputNumbers();
        showNumbers();
        registerOperators();
        List<Integer> results = calcBinaryOperation();
        System.out.println(results);
    }

    // 二項演算に必要な数を入力させる。ユーザには触らせない。
    public void inputNumbers() {
        Scanner scan = new Scanner(System.in);
        System.out.print("You can input two numbers: ");
        this.x = scan.nextInt();
        this.y = scan.nextInt();
    }

    public void showNumbers(){
        System.out.println(String.format("x=%d and y=%d was inputed.", x, y));
    }

    // 二項演算の計算を登録する。ユーザには触らせない。
    public void register(BinaryOperator op){
        operators.add(op);
    }

    // 唯一ユーザに触らせる箇所。定義した二項演算をregisterメソッドを使って登録する。
    public void registerOperators(){
        register(new Adder());
        register(new Multiplier());
    }

    // 登録された二項演算を使い計算をしていく。
    public List<Integer> calcBinaryOperation(){
        return operators.stream().map(op -> op.apply(x, y)).collect(Collectors.toList());
    }

    public static void main(String[] args){
        new BinaryOperationSimulator();
    }
}
// ユーザが足し算の二項演算を自由に定義し拡張
public class Adder implements BinaryOperator {
    public int apply(int x, int y){
        return x + y;
    }
}