public class CoffeeBar { //装饰者模式 public static void main(String[] args) throws Exception { Drink drink = new LongBlackCoffee(); System.out.println(drink.cost() + "_ " + drink.cost()); drink = new MilkDecorate(drink); System.out.println(drink.cost() + "_ " + drink.cost()); drink = new MilkDecorate(drink); System.out.println(drink.cost()); System.out.println(drink.getDes()); /** * io中的装饰者 * 1.inputstream是抽象类,是一个基类 * 2.FileInputStream是inputstream的子类,是具体的被装饰者 * 3.FilterInputStream是inputstream的子类,是装饰者的基类,类似咖啡样例中的Decorate类 * 4.DataInputStream是FilterInputStream的子类,是具体的装饰者,类似咖啡样例中的Milk * 5.FilterInputStream中有protected volatile InputStream in;即含被装饰者对象 * */ DataInputStream dis = new DataInputStream( new FileInputStream( "/home/d.txt" )); System.out.println(dis.read()); } } public abstract class Drink { //抽象类 //描述 public String des; //金额 public Double price; public String getDes() { return des; } public void setDes(String des) { this .des = des; } public Double getPrice() { return price; } public void setPrice(Double price) { this .price = price; } /** * 计算价格 * @return */ public abstract Double cost(); } public class Coffee extends Drink { //被装饰者基类 咖啡 @Override public Double cost() { return price; } } public class LongBlackCoffee extends Coffee{ //具体被装饰的对象 美式咖啡 public LongBlackCoffee(){ setDes( "单品咖啡" ); setPrice( 5 .5d); } } public class Decorate extends Drink { private Drink coffee; //装饰者 采用组合的方式将被装饰者传入 public Decorate(Drink coffee){ this .coffee = coffee; } @Override public Double cost() { return getPrice() + coffee.cost(); } public String getDes() { return des + " " + getPrice() + "&&" + coffee.getDes(); } } public class MilkDecorate extends Decorate{ //具体的装饰对象 public MilkDecorate(Drink coffee) { super (coffee); setDes( "牛奶调料" ); setPrice( 2.2 ); } } |