天天看点

Java设计模式之装饰者模式一、什么是装饰者模式?二、装饰者模式的应用

一、什么是装饰者模式?

        装饰器模式是指在不改变原有的类和使用继承的情况下,动态地扩展一个对象的功能,他是通过创建一个包装对象,也就是装饰包裹的对象。

        装饰者模式能够动态的扩展对象的功能,符合软件架构的设计的开闭原则:  对扩展开放、对修改关闭。

        继承是在编译时静态决定的,所有的子类都会获取到父类的行为。如果使用组合,那么可以在运行时对对象进行动态的扩展。

二、装饰者模式的应用

        在实际的项目开发中,举个栗子,一般会遇到一些商品大促的时候,这个时候的价格往往比平时要低很多,一般优惠的方式有多种, 比如: 折扣、满减、直降等。我们可以利用装饰者模式来获取到优惠后的价格,同时又不影响到商品平时的价格。

商品获取价格接口类:

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));
    }
}
           

打印结果:

Java设计模式之装饰者模式一、什么是装饰者模式?二、装饰者模式的应用

参考: 

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