import java.util.Random;
class Result {
private String name;
private Result(String name) {
this.name = name;
}
public final static Result LessThan = new Result("Less than"), Equal = new Result("equal"),
GreaterThan = new Result("Greater than");
public String toString() {
return name;
}
}
interface Number {
Result compete(Number it);
Result eval(One p);
Result eval(Two s);
Result eval(Three r);
}
class One implements Number {
public Result compete(Number it) {
return it.eval(this);
}
public Result eval(One p) {
return Result.GreaterThan;
}
public Result eval(Two s) {
return Result.LessThan;
}
public Result eval(Three r) {
return Result.Equal;
}
public String toString() {
return "One";
}
}
class Two implements Number {
public Result compete(Number it) {
return it.eval(this);
}
public Result eval(One p) {
return Result.Equal;
}
public Result eval(Two s) {
return Result.GreaterThan;
}
public Result eval(Three r) {
return Result.LessThan;
}
public String toString() {
return "Two";
}
}
class Three implements Number {
public Result compete(Number it) {
return it.eval(this);
}
public Result eval(One p) {
return Result.LessThan;
}
public Result eval(Two s) {
return Result.Equal;
}
public Result eval(Three r) {
return Result.GreaterThan;
}
public String toString() {
return "Three";
}
}
class NumberGenerator {
private static Random rand = new Random();
public static Number newItem() {
switch (rand.nextInt(3)) {
default:
case 0:
return new Two();
case 1:
return new One();
case 2:
return new Three();
}
}
}
class Compete {
public static void match(Number a, Number b) {
System.out.println(a + " " + a.compete(b) + " vs. " + b);
}
}
public class MultipleDispathDemo {
public static void main(String args[]) {
int SIZE = 20;
for (int i = 0; i < SIZE; i++)
Compete.match(NumberGenerator.newItem(), NumberGenerator.newItem());
}
}
|