p15 装饰器设计模式:模拟咖啡

/**
 * p15 装饰器设计模式
 *节点流:直接与数据源打交道(数组,文件),
 *处理流:装饰器设计模式
 *装饰器设计模式 :面向对象;
 */

/**
 * 模拟咖啡
 * 1抽象组件:需要安装的抽象对象(接口或者抽象父类)
 * 2具体组件:要装饰的对象
 * 3抽象装饰类:包含了对抽象组件的引用以及装饰者共有的方法
 * 4具体装饰类:被装饰的对象
 *
 */
public class FileUtils {
    public void main(String[] args){
        Drink coffee = new Coffee();
        //咖啡单独加糖
        Drink suger = new Suger(coffee);//装饰
        System.out.println(suger.info()+"--->" +suger.cost());
        //咖啡单独加牛奶
        Drink milk = new Milk(coffee);//装饰
        System.out.println(milk.info()+"--->" +milk.cost());
        //咖啡加了糖后牛奶
        milk = new Milk(suger);//装饰
        System.out.println(milk.info()+"--->" +milk.cost());
    }
}
//抽象组件
interface Drink{
    double cost();//费用
    String info();//说明
}
 class Coffee implements Drink{
     private String name="原味";
     @Override
     public double cost(){
         return 10;
     }
     @Override
     public String info(){
         return name;
     };
 }
 //抽象装饰类
abstract  class Decorate implements Drink{
     //对抽象组件的引用
     private Drink drink;
     //对抽象组件的引用 写到构造器
     Decorate(Drink drink){
         this.drink =drink;
     }
     @Override
     public double cost(){
         return this.drink.cost();        
     };//费用
     @Override
     public String info(){
         return this.drink.info();        
     };//说明
 }

//具体装饰类
class Milk extends Decorate{
    public Milk(Drink drink){
        super(drink);
    }
     @Override
     public double cost(){
         return super.cost()*4;        
     };//费用
     @Override
     public String info(){
         return super.info()+" 加入了牛奶。";        
     };//说明
}

//具体装饰类
class Suger extends Decorate{
    public Suger(Drink drink){
        super(drink);
    }
     @Override
     public double cost(){
         return super.cost()*2;        
     };//费用
     @Override
     public String info(){
         return super.info()+" 加入了蔗糖。";        
     };//说明
}

 

 

你可能感兴趣的:(java)