一、概述:
2.定义蛋糕底:
3.定义蛋糕的装饰者接口:
4.定义装饰者:
蛋糕店卖蛋糕,有基本的底,如奶油蛋糕,允许客户订制配置,如:加草莓,加巧克力,结账方式:底+配置(装饰)
二、分析:
除了基本的底之外所有的配置,都是装饰者,可以将其抽象出一个接口,蛋糕底也有多样,也可以创建一个借口
三、解决方法:
1.创建蛋糕底接口:
/**
* 蛋糕底接口
* @author yu
*
*/
public interface Cake {
/**
* 结账方法
* @return
*/
public float cost();
}
2.定义蛋糕底:
/**
* 蛋糕底,如奶油蛋糕
* @author yu
*
*/
public class MilkCake implements Cake {
private float price = 100f;
@Override
public float cost() {
return price;
}
}
3.定义蛋糕的装饰者接口:
public abstract class CakeDecorator implements Cake {
}
4.定义装饰者:
/**
* 加了巧克力的蛋糕
* @author yu
*
*/
public class ChrolateCake extends CakeDecorator {
private Cake cake;
private float price = 10f; //巧克力的价格
public ChrolateCake(Cake cake){
this.cake = cake;
}
/**
* 计算加了巧克力后的价格
*/
@Override
public float cost() {
return cake.cost() + price;
}
}
5。测试,订制蛋糕,并计算价格:
MilkCake m = new MilkCake(); //选择了奶油蛋糕底
ChrolateCake cc= new ChrolateCake(m); //加了巧克力
System.out.println(cc.cost());
在此模式中除了主题(蛋糕底)之外,所有的配置(樱桃,巧克力等)都是装饰者,实际中可以根据寻求往主题上添加,只要在new装饰者时将最后的实现了Cake接口的类传进去就OK了
四、小结:
装饰者模式在java.io包中使用的最为广泛,典型的一层套一层的做法,原有的输入流不具有某些方法,可以在外面套一层,就可以利用其特殊的方法了,如:
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = null;
s = br.readLine();