Design Pattern Java Tutorial

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