【设计模式】之装饰模式

本文介绍的是:装饰模式是什么它的优缺点装饰模式该怎么使用什么时候使用?我不想废话了,直接开始说吧。

什么是装饰模式?

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

优点

  • 动态的为对象增加新功能或撤销功能(继承是做不到这一点)
  • 符合设计原则之开闭原则
  • 有效的将核心代码和装饰代码区分开来

缺点

  • 会产生很多相似对象

需要的内容

  • 装饰对象类。
  • 对象接口。给对象动态添加‘装饰’
  • 装饰类。装饰抽象类,继承对象接口
  • 添加的一些装饰的组件。‘各种具体的装饰’

使用情况

  • 需要执行特殊行为时,客户代码可以根据需要有选择的,有有顺序的使用装饰功能包装对象。

案例说明: 假设现在有一个煎饼店,他们的煎饼原价是8元,加鸡蛋则在原价上再加3元,加蔬菜则在价格上再加2元,加肉丝在价格上加5元…如此多的装饰内容,我们在不修改煎饼对象本身的情况下给它计算价格,更改食材。每新增一种食材或删除一种食材,咱们就新增或删除一个‘装饰类’。

具体实现如下:

使用装饰模式步骤如下:

  • 对象接口
abstract class ABattercake {
    
    abstract fun getDesc():String

    abstract fun cost():Int
}
  • 装饰对象类:煎饼类
open class Battercake :ABattercake(){

    override fun getDesc(): String {
        return "煎饼"
    }

    override fun cost(): Int {
        return 8
    }
}
  • 装饰类
open class AbstractDecorator :Battercake{

    private lateinit var aBattercake: ABattercake

    constructor(aBattercake: ABattercake) : super(){
        this.aBattercake=aBattercake
    }


    override fun getDesc(): String {
        return this.aBattercake.getDesc()
    }

    override fun cost(): Int {
        return this.aBattercake.cost()
    }
}
  • 具体装饰组件1:加鸡蛋
class EggDecorator :AbstractDecorator{
    constructor(aBattercake: ABattercake) : super(aBattercake)

    override fun getDesc(): String {
        return super.getDesc()+"加一个鸡蛋"
    }

    override fun cost(): Int {
        return super.cost()+3
    }
}
  • 具体装饰组件2:加蔬菜
class VegetableDecorator :AbstractDecorator{
    constructor(aBattercake: ABattercake) : super(aBattercake)

    override fun getDesc(): String {
        return super.getDesc()+"加蔬菜"
    }

    override fun cost(): Int {
        return super.cost()+2
    }
}
  • 调用代码
fun setDecoratePattern(){
        var aBattercake:ABattercake=Battercake()
        aBattercake=EggDecorator(aBattercake)
        aBattercake=VegetableDecorator(aBattercake)

        Log.i("tang","煎饼价格="+aBattercake.cost())
    }

Log结果

煎饼价格=13

阿sweet想说:核心类煎饼的代码未受影响,调用代码的部分十分简洁,添加删除装饰组件很方便,无论是可读还是可维护性上来说都nice。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值