package patterns.doubledispatch;
import patterns.trash.*;
import java.util.*;
class AluminumBin extends TypedBin {
public AluminumBin() { super("Aluminum"); }
@Override public boolean add(Aluminum a) {
return addIt(a);
}
}
class PaperBin extends TypedBin {
public PaperBin() { super("Paper"); }
@Override public boolean add(Paper a) {
return addIt(a);
}
}
class GlassBin extends TypedBin {
public GlassBin() { super("Glass"); }
@Override public boolean add(Glass a) {
return addIt(a);
}
}
class CardboardBin extends TypedBin {
public CardboardBin() { super("Cardboard"); }
@Override public boolean add(Cardboard a) {
return addIt(a);
}
}
class TrashBinSet {
public final List<TypedBin> binSet =
Arrays.asList(
new AluminumBin(), new PaperBin(),
new GlassBin(), new CardboardBin()
);
@SuppressWarnings("unchecked")
public void sortIntoBins(List bin) {
bin.forEach( aBin -> {
TypedBinMember t = (TypedBinMember)aBin;
if(!t.addToBin(binSet))
throw new RuntimeException(
"sortIntoBins() couldn't add " + t);
});
}
}
public class DoubleDispatch {
public static void main(String[] args) {
List<Trash> bin = new ArrayList<>();
ParseTrash.fillBin("doubledispatch", bin);
TrashBinSet bins = new TrashBinSet();
bins.sortIntoBins(bin);
bins.binSet.forEach(tb ->
TrashValue.sum(tb.bin(), tb.type));
TrashValue.sum(bin, "Trash");
}
}
Loading patterns.doubledispatch.Cardboard
Loading patterns.doubledispatch.Paper
Loading patterns.doubledispatch.Aluminum
Loading patterns.doubledispatch.Glass
Aluminum weight: 1.80 * price: 1.67 = 3.01
Aluminum weight: 3.40 * price: 1.67 = 5.68
Aluminum weight: 2.70 * price: 1.67 = 4.51
Total Aluminum value = 13.19
Paper weight: 8.00 * price: 0.10 = 0.80
Paper weight: 6.60 * price: 0.10 = 0.66
Paper weight: 9.10 * price: 0.10 = 0.91
Total Paper value = 2.37
Glass weight: 5.40 * price: 0.23 = 1.24
Glass weight: 4.30 * price: 0.23 = 0.99
Glass weight: 3.60 * price: 0.23 = 0.83
Total Glass value = 3.06
Cardboard weight: 4.40 * price: 0.11 = 0.48
Cardboard weight: 2.20 * price: 0.11 = 0.24
Cardboard weight: 1.20 * price: 0.11 = 0.13
Total Cardboard value = 0.86
Cardboard weight: 4.40 * price: 0.11 = 0.48
Paper weight: 8.00 * price: 0.10 = 0.80
Aluminum weight: 1.80 * price: 1.67 = 3.01
Glass weight: 5.40 * price: 0.23 = 1.24
Aluminum weight: 3.40 * price: 1.67 = 5.68
Cardboard weight: 2.20 * price: 0.11 = 0.24
Glass weight: 4.30 * price: 0.23 = 0.99
Cardboard weight: 1.20 * price: 0.11 = 0.13
Paper weight: 6.60 * price: 0.10 = 0.66
Aluminum weight: 2.70 * price: 1.67 = 4.51
Paper weight: 9.10 * price: 0.10 = 0.91
Glass weight: 3.60 * price: 0.23 = 0.83
Total Trash value = 19.48
*/