参考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 "有了黑豆更营养!"; } }