Mega Code Archive

 
Categories / Java Tutorial / Design Pattern
 

Multiple dispatching

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());   } }