interface Countable { float getValue(); String getName(); } class Book implements Countable { private String description = "books"; private float value = 0.75f; public float getValue() { return value; } public String getName() { return description; } } class Dog implements Countable { private String description = "dogs"; private float cost = 1; public float getValue() { return cost; } public String getName() { return description; } } class Cat implements Countable { private float cost = 1; private String description = "Cat"; public float getValue() { return cost; } public String getName() { return description; } } class Child implements Countable { private float cost = 1; private String description = "child"; public float getValue() { return cost; } public String getName() { return description; } } class Cow implements Countable { private float cost = 1.25f; private String description = "Cow"; public float getValue() { return cost; } public String getName() { return description; } } abstract class Number implements Countable { protected Countable component; public Number(Countable component) { this.component = component; } public float getValue() { return component.getValue(); } public String getName() { return component.getName(); } } class MyBook extends Number { private float cost = 0.75f; public MyBook(Countable component) { super(component); } public String getName() { return component.getName() + " my books"; } public float getValue() { return cost + component.getValue(); } } class Integer extends Number { private float cost = 0.50f; public Integer(Countable component) { super(component); } public float getValue() { return cost + component.getValue(); } public String getName() { return component.getName() + " integer"; } } class Float extends Number { public Float(Countable component) { super(component); } public String getName() { return component.getName() + " float"; } } class Double extends Number { public Double(Countable component) { super(component); } public String getName() { return component.getName() + " double"; } } class Decimal extends Number { public Decimal(Countable component) { super(component); } public String getName() { return component.getName() + " decimal"; } } public class CountableDemo { public static void main(String[] args) { Countable cappuccino = new Cat(); System.out.println(cappuccino.getName() + ": $" + cappuccino.getValue()); Countable cafeMocha = new Integer(new Float(new Cow())); System.out.println(cafeMocha.getName() + ": $" + cafeMocha.getValue()); } }