以饮料为例
Beverage接口
public interface Beverage {
public int getprice();//获得价格
public String getDescription();//获得描述
}
CoffeeBean1类和CoffeeBean2类
public class CoffeeBean1 implements Beverage{
@Override
public int getprice() {
// TODO Auto-generated method stub
return 10;
}
@Override
public String getDescription() {
String desc="第一种咖啡豆";
return desc;
}
}
public class CoffeeBean2 implements Beverage{
@Override
public int getprice() {
// TODO Auto-generated method stub
return 20;
}
@Override
public String getDescription() {
String desc="第二种咖啡豆";
return desc;
}
}
DecorateClass装饰类
public interface DecorateClass extends Beverage{
String decorate="我只是装饰器";
}
多个装饰类(这里只写了两个)
public class Milk implements DecorateClass{
private Beverage beverage;
public Milk(Beverage beverage) {
super();
this.beverage = beverage;
}
@Override
public int getprice() {
// TODO Auto-generated method stub
return 5+beverage.getprice();
}
@Override
public String getDescription() {
String desc="加了牛奶";
return beverage.getDescription()+desc;
}
}
public class Sugar implements DecorateClass{
private Beverage beverage;
public Sugar(Beverage beverage) {
super();
this.beverage = beverage;
}
@Override
public int getprice() {
// TODO Auto-generated method stub
return 2+beverage.getprice();
}
@Override
public String getDescription() {
String desc="加了糖";
return beverage.getDescription()+desc;
}
}
测试类
public class TestDecoratePattern {
public static void main(String[] args) {
Beverage beverage=new Milk(new Sugar(new CoffeeBean1()));
System.out.println("价格:"+beverage.getprice());
System.out.println("描述:"+beverage.getDescription());
}
}
输出:
价格:17
描述:第一种咖啡豆加了糖加了牛奶
以下文本内容来自
https://blog.csdn.net/zhshulin/article/details/38665187?utm_source=copy 这篇文章介绍的更详细
为什么要使用装饰者模式?
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。不改变接口的前提下,增强所考虑的类的性能。
何时使用:
1)需要扩展一个类的功能,或给一个类增加附加责任。
2)需要动态的给一个对象增加功能,这些功能可以再动态地撤销。
3)需要增加一些基本功能的排列组合而产生的非常大量的功能,从而使继承变得 不现实。