装饰器模式

package com.sxt.io;
/**
 * 模拟咖啡
 * 1、抽象组件:需要装饰的抽象对象(接口或抽象父类)
 * 2、具体组件:需要装饰的对象
 * 3、抽象装饰类:包含了对抽象组件的引用以及装饰着共有的方法
 * 4、具体装饰类:被装饰的对象
 * @author TW
 *
 */
public class DecorateTest02 {
    public static 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;
    public 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()+"加入了蔗糖";
    }    
}
原文地址:https://www.cnblogs.com/jiefangzhe/p/11307381.html