装饰者模式

参考http://www.cnblogs.com/rookieFly-tdiitd/p/4914593.html
这里写图片描述

/**
 * 装饰者模式就是主要为被装饰对象更新方法中的内容,当装饰者类有多种(即可以装饰多种不同的内容时),通过建立实现了“被装饰对象实现的接口”(如该例中的Drink)的抽象类为它们的基类,
 * 那这些装饰者子类对象便能相互组合(如该例中的牛奶+豆浆、糖+牛奶+豆浆等)
 * @author PC
 * @date 2018年4月27日下午2:57:02
 * @version V1.0
 */
public class DecoratorPattern {
    public static void main(String[] args) {
        sugar sugarSyoa=new sugar(new Soya());
        System.out.println(sugarSyoa.getInfo()+" 价钱: "+sugarSyoa.getPrice());
        milk milkSugarSysoa=new milk(sugarSyoa);
        System.out.println(milkSugarSysoa.getInfo()+" 价钱: "+milkSugarSysoa.getPrice());
        System.out.println(milkSugarSysoa.proud());//一般不这样使用装饰者模式
        blackBean blackBeanMilkSugarSysoa=new blackBean(milkSugarSysoa);
        System.out.println(blackBeanMilkSugarSysoa.getInfo()+" 价钱 "+blackBeanMilkSugarSysoa.getPrice());
        System.out.println(blackBeanMilkSugarSysoa.proud());//一般不这样使用装饰者模式

    }
}
interface Drink{
    String getInfo();
    double getPrice();
    //public String proud();
}
/**
 * 抽象出一个接口,作为装饰者构造函数的参数,即被装饰者的父类
 * @author PC
 * @date 2018年4月27日下午1:01:21
 * @version V1.0
 */
class Soya implements Drink{
    double price=1.0d;
    @Override
    public String getInfo() {
        String name="豆浆";
        return name;
    }

    @Override
    public double getPrice() {
        return price;
    }

    /*@Override
    public String proud() {
        // TODO Auto-generated method stub
        return null;
    }*/
}
/**
 * 装饰者基类,被装饰对象的原型放在这里(引用被传进来)。下面的装饰者对象只是附加或者更新了行为(方法)
 * 
 * @author PC
 * @date 2018年4月27日下午12:34:33
 * @version V1.0
 */
abstract class decorator implements Drink{
    Drink drink;
    public decorator(Drink drink) {
        this.drink=drink;
    }
    @Override
    public String getInfo() {
        // TODO Auto-generated method stub
        return drink.getInfo();
    }
    @Override
    public double getPrice() {
        // TODO Auto-generated method stub
        return drink.getPrice();
    }
}
/**
 * 装饰者类-糖,更新了行为(方法)
 * @author PC
 * @date 2018年4月27日下午1:01:30
 * @version V1.0
 */
class sugar extends decorator{
    double price=0.5d;
    public sugar(Drink drink) {
        super(drink);
        // TODO Auto-generated constructor stub
    }

    @Override
    public String getInfo() {

        return "糖+"+super.getInfo();
    }

    @Override
    public double getPrice() {
        // TODO Auto-generated method stub
        return price+super.getPrice();
    }


    public String proud() {
        // TODO Auto-generated method stub
        return null;
    }
}
/**
 * 装饰者类—牛奶,更新了行为(方法getInfo、getPrice),添加了行为proud(该类对象继续被装饰后,此方法无法被下级装饰者对象调用),可被该装饰者对象调用。
 * 若要使添加的proud能被下级装饰者对象调用,则需要在Drink中添加该方法,装饰者基类也要重写该方法。
 * 故一般不用来添加新的方法。只用来更新原有的方法或者说向原有的方法增加新的行为(如先执行super.getInfo,再执行新定义的行为等)
 * @author PC
 * @date 2018年4月27日下午1:02:47
 * @version V1.0
 */
class milk extends decorator{
    double price=2.0d;
    public milk(Drink drink) {
        super(drink);
        // TODO Auto-generated constructor stub
    }

    @Override
    public String getInfo() {

        return "牛奶+"+super.getInfo();
    }

    @Override
    public double getPrice() {
        // TODO Auto-generated method stub
        return price+super.getPrice();
    }
    public String proud() {
        return "有了牛奶最好喝!";
    }
}
/**
 * 装饰者类—黑豆,更新了行为(方法getInfo、getPrice),添加了行为proud(该类对象继续被装饰后,此方法无法被下级装饰者对象调用),可被该装饰者对象调用
 * @author PC
 * @date 2018年4月27日下午1:04:56
 * @version V1.0
 */
class blackBean extends decorator{
    double price=1.5d;
    public blackBean(Drink drink) {
        super(drink);
        // TODO Auto-generated constructor stub
    }

    @Override
    public String getInfo() {

        return "黑豆+"+super.getInfo();
    }

    @Override
    public double getPrice() {
        // TODO Auto-generated method stub
        return price+super.getPrice();
    }
    public String proud() {
        //System.out.println(super.drink.proud());//是不能通过的,因为drink是一个接口引用变量,只能使用接口中提供的方法
        return "有了黑豆更营养!";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值