装饰者模式的使用~

之前看rxjava时,看到有使用装饰者模式,于是来巩固一下~

装饰者模式的定义

装饰者模式:动态的给一个对象添加一些额外的职责。装饰者模式比生成子类来说更为灵活

装饰者模式组成

  • 抽象构件

接口或者抽象类,定义最核心的对象,也就是原始对象。

  • 具体构件

具体构件实现

  • 抽象装饰角色

一般是一个抽象类,实现接口或者抽象方法,引入抽象构件。

  • 具体装饰角色

具体装饰角色,把基础核心功能装饰成其他东西

装饰者模式优缺点

优点:

  • 装饰类和被装饰类可以独立发展,不会相互耦合。
  • 装饰者模式是继承关系的一个替代。
  • 装饰者模式可以动态的扩展一个实现类的功能。
    缺点:
  • 多层装饰是比较复杂的,所以应尽量减少装饰类的数量,降低复杂度。

使用场景

  • 需要一个扩展类的功能,或者给一个类增加功能
  • 动态给对象增加功能,这些功能还可以动态的取消
  • 需要为一批兄弟类进行改装,首选装饰者

实例

场景是一个购物流程,在价格基础上增加活动,比如满减活动,买东西送礼品活动。

  • 定义抽象构件

/**
 * 抽象商品
 */
abstract class GoodsComponent {
    /**
     * 商品价格
     */
    abstract fun priceNum()

}
  • 具体的构件
/**
 * 具体商品
 */
class RealGoods : GoodsComponent() {
    override fun priceNum() {
        println("价格只要998...")
    }
}
  • 定义抽象装饰者
// 需要传入基本构件 来给构件增加功能
abstract class GoodsDecorator(private val component: GoodsComponent) : GoodsComponent() {
    override fun priceNum() {
        // 委托给被修饰者去执行
        component.priceNum()
    }
}
  • 具体装饰类
/**
 * 增加满减功能
 */
class FullReductionDecorator(private val component: GoodsComponent) : GoodsDecorator(component) {


    private fun fullReduction(){
        println("增加了满减活动.....")
    }

    override fun priceNum() {
        super.priceNum()
        // 金钱上提示满减
        fullReduction()
    }
}

/**
 * 增加送礼物功能
 */
class GiftDecorator(private val component: GoodsComponent) : GoodsDecorator(component) {


    private fun gift(){
        println("增加了送礼活动.....")
    }

    override fun priceNum() {
        super.priceNum()
        // 买东西送额外礼物
        gift()
    }


}
  • 使用方式
   @Test
    fun test() {
    	// 创建基本构件
        var goodsComponent: GoodsComponent = RealGoods()
        // 第一次修饰 增加礼物
        goodsComponent = GiftDecorator(goodsComponent)
        // 第二次修饰 增加满减
        goodsComponent = FullReductionDecorator(goodsComponent)
        // 运行
        goodsComponent.priceNum()

    }

  • 运行结果如下:
价格只要998...
增加了送礼活动.....
增加了满减活动.....
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值