interface Countable { String getName(); float getCount(); } class Book implements Countable { public String getName() { return "Book"; } public float getCount() { return 0; } } abstract class Number implements Countable { protected Countable component; Number(Countable component) { this.component = component; } public float getCount() { return component.getCount(); } public abstract String getName(); } class Integer extends Number { private float value = 0.75f; private String description = " integer"; public Integer(Countable component) { super(component); } public float getCount() { return component.getCount() + value; } public String getName() { return component.getName() + description; } } class Float extends Number { private String description = " float"; public Float(Countable component) { super(component); } public String getName() { return component.getName() + description; } } class Double extends Number { private float value = 0.25f; private String description = " double"; public Double(Countable component) { super(component); } public float getCount() { return component.getCount() + value; } public String getName() { return component.getName() + description; } } class Decimal extends Number { private float value = 0.25f; private String description = " decimal"; public Decimal(Countable component) { super(component); } public float getCount() { return component.getCount() + value; } public String getName() { return component.getName() + description; } } class Positive extends Number { private float cost = 0.25f; private String description = " positive"; public Positive(Countable component) { super(component); } public float getCount() { return component.getCount() + cost; } public String getName() { return component.getName() + description; } } class Negative extends Number { private float value = -0.25f; private String description = " negative"; public Negative(Countable component) { super(component); } public float getCount() { return component.getCount() + value; } public String getName() { return component.getName() + description; } } public class NumberCountableDemo { public static void main(String[] args) { Countable cappuccino = new Integer(new Double(new Book())); System.out.println(cappuccino.getName().trim() + ": $" + cappuccino.getCount()); Countable cafeMocha = new Integer(new Decimal(new Negative(new Positive(new Float( new Book()))))); System.out.println(cafeMocha.getName().trim() + ": $" + cafeMocha.getCount()); } }