一、什么是装饰者模式?
装饰器模式是指在不改变原有的类和使用继承的情况下,动态地扩展一个对象的功能,他是通过创建一个包装对象,也就是装饰包裹的对象。
装饰者模式能够动态的扩展对象的功能,符合软件架构的设计的开闭原则: 对扩展开放、对修改关闭。
继承是在编译时静态决定的,所有的子类都会获取到父类的行为。如果使用组合,那么可以在运行时对对象进行动态的扩展。
二、装饰者模式的应用
在实际的项目开发中,举个栗子,一般会遇到一些商品大促的时候,这个时候的价格往往比平时要低很多,一般优惠的方式有多种, 比如: 折扣、满减、直降等。我们可以利用装饰者模式来获取到优惠后的价格,同时又不影响到商品平时的价格。
商品获取价格接口类:
import java.math.BigDecimal;
/**
* @decription:
* @author: zhengbing.zhang
* @date: 2021/7/19 15:16
*/
public interface ProductPrice {
BigDecimal getPrice(Long productId);
}
实现类:
import java.math.BigDecimal;
/**
* @decription:
* @author: zhengbing.zhang
* @date: 2021/7/19 15:30
*/
public class ProductPriceImpl implements ProductPrice {
@Override
public BigDecimal getPrice(Long productId) {
return new BigDecimal("1.0");
}
}
折扣活动类:
import java.math.BigDecimal;
/**
* @decription:
* @author: zhengbing.zhang
* @date: 2021/7/19 15:19
* 折扣活动,装饰器类
*/
public class ProductDiscountActivity implements ProductPrice {
private ProductPrice productPrice;
private BigDecimal rate;
public ProductDiscountActivity(ProductPrice productPrice, BigDecimal rate) {
this.productPrice = productPrice;
this.rate = rate;
}
@Override
public BigDecimal getPrice(Long productId) {
return productPrice.getPrice(productId);
}
public BigDecimal getReducedPrice(Long productId) {
return getPrice(productId).multiply(rate);
}
}
在折扣类里,添加getReducedPrice()方法,来获取折扣后的价格。
import java.math.BigDecimal;
/**
* @decription:
* @author: zhengbing.zhang
* @date: 2021/7/19 15:22
*/
public class Main {
public static void main(String[] args) {
ProductDiscountActivity discountActivity
= new ProductDiscountActivity(new ProductPriceImpl(), new BigDecimal("0.5"));
System.out.println("原来的价格为:" + discountActivity.getPrice(1L));
System.out.println("折扣后的价格为:" + discountActivity.getReducedPrice(1L));
}
}
打印结果:

参考:
https://baike.baidu.com/item/%E8%A3%85%E9%A5%B0%E6%A8%A1%E5%BC%8F/10158540