java设计模式-装饰者模式
装饰者模式(Decorator)
定义
1、动态的将新功能附加到对象上,在对象功能扩展方面,他比继承更有弹性,也体现了开闭原则(OCP)
2、这里提到的动态的将新功能附加到对象和OCP原则,在后面应用实际上会以代码的形式体现。
//=====================饮料========================
// 饮料
@Data
public abstract class Drink {
//描述
public String description;
//价格
private float price=0.0f;
//计算费用的抽象方法
//子类去实现
public abstract float cost();
}
public class Coffee extends Drink {
@Override
public float cost() {
return super.getPrice();
}
}
public class EspressoCoffer extends Coffee {
public EspressoCoffer() {
setDescription("意大利咖啡");
setPrice(6.0f);
}
}
public class LongBlackCoffer extends Coffee {
public LongBlackCoffer() {
setDescription("美式咖啡");
setPrice(5.0f);
}
}
public class DecafCoffee extends Coffee {
public DecafCoffee() {
setDescription(" 无因咖啡 ");
setPrice(1.0f);
}
}
public class ShortBlackCoffer extends Coffee {
public ShortBlackCoffer() {
setDescription(" short Black coffer");
setPrice(5.6f);
}
}
//===================装饰者类==========================
/**
* 装饰者
*
* @author Administrator
* @description
*/
public class Decorator extends Drink {
private Drink obj;
//组合
public Decorator(Drink obj) {
this.obj = obj;
}
@Override
public float cost() {
//自己的价格 + drink的价格
return super.getPrice() + obj.cost();
}
@Override
public String getDescription() {
//输出了被装饰者的信息
return super.description + "" + super.getPrice() + " && " + obj.getDescription();
}
}
//巧克力
public class ChocolateDecorator extends Decorator {
public ChocolateDecorator(Drink obj) {
super(obj);
setDescription(" 巧克力 ");
//调味品的价格
setPrice(3.0f);
}
}
//牛奶调味品
public class MilkDecorator extends Decorator {
public MilkDecorator(Drink obj) {
super(obj);
setDescription(" 牛奶 ");
setPrice(2.0f);
}
}
//豆浆
public class SoyDecorator extends Decorator {
public SoyDecorator(Drink obj) {
super(obj);
setDescription(" 豆浆 ");
setPrice(1.5f);
}
}
//====================调用=============================
@Slf4j
public class CofferBarClient {
public static void main(String[] args) {
//装饰者模式下的订单:2份巧克力+一份牛奶的LongBlack
//1、点一份LongBlack
Drink order=new LongBlackCoffer();
log.info("费用1:{}",order.cost());
log.info("描述1:{}",order.getDescription());
//order加一分牛奶
order=new MilkDecorator(order);
log.info("费用1:{}",order.cost());
log.info("描述1:{}",order.getDescription());
//order 加一分巧克力
order=new ChocolateDecorator(order);
log.info("费用1:{}",order.cost());
log.info("描述1:{}",order.getDescription());
//order 加一分巧克力
order=new ChocolateDecorator(order);
log.info("费用1:{}",order.cost());
log.info("描述1:{}",order.getDescription());
log.info("=======================================");
Drink order2=new DecafCoffee();
log.info("费用2:{}",order2.cost());
log.info("描述2:{}",order2.getDescription());
order2=new ChocolateDecorator(order2);
log.info("费用2:加入一份巧克力{}",order2.cost());
log.info("描述2:加入一份巧克力{}",order2.getDescription());
}
}
- 输出信息
描述1:美式咖啡
费用1:7.0
描述1: 牛奶 2.0 && 美式咖啡
费用1:10.0
描述1: 巧克力 3.0 && 牛奶 2.0 && 美式咖啡
费用1:13.0
描述1: 巧克力 3.0 && 巧克力 3.0 && 牛奶 2.0 && 美式咖啡
=======================================
费用2:1.0
描述2: 无因咖啡
费用2:加入一份巧克力4.0
描述2:加入一份巧克力 巧克力 3.0 && 无因咖啡
源码中的使用(InputStream)
public abstract class InputStream implements Closeable{}//是一个抽象类,即Component
public class FilterInputStream extends InputStream{//是一个装饰者类Decorator
protected volatile InputStream in //被装饰的对象 }
class DataInputStream extends FilterInputStream implements DataInput{//FilterInputStream子类,