Java Tutorial/Design Pattern/Decorator Pattern

Материал из Java эксперт
Перейти к: навигация, поиск

Coffee example using decorators

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





combinations and decorators

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





Creating and Extending Objects with the Decorator Patterns

public class MainClass {
  public static void main(String args[]) {
    Computer computer = new Computer();
    computer = new Disk(computer);
    computer = new Monitor(computer);
    computer = new CD(computer);
    computer = new CD(computer);
    System.out.println("You"re getting a " + computer.description() + ".");
  }
}
class Disk extends ComponentDecorator {
  Computer computer;
  public Disk(Computer c) {
    computer = c;
  }
  public String description() {
    return computer.description() + " and a disk";
  }
}
class CD extends ComponentDecorator {
  Computer computer;
  public CD(Computer c) {
    computer = c;
  }
  public String description() {
    return computer.description() + " and a CD";
  }
}
class Computer {
  public Computer() {
  }
  public String description() {
    return "computer";
  }
}
abstract class ComponentDecorator extends Computer {
  public abstract String description();
}
class Monitor extends ComponentDecorator {
  Computer computer;
  public Monitor(Computer c) {
    computer = c;
  }
  public String description() {
    return computer.description() + " and a monitor";
  }
}