本文介绍的是:装饰模式是什么,它的优缺点,装饰模式该怎么使用,什么时候使用?我不想废话了,直接开始说吧。
什么是装饰模式?
- 装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
优点
- 动态的为对象增加新功能或撤销功能(继承是做不到这一点)
- 符合设计原则之开闭原则
- 有效的将核心代码和装饰代码区分开来
缺点
- 会产生很多相似对象
需要的内容
- 装饰对象类。
- 对象接口。给对象动态添加‘装饰’
- 装饰类。装饰抽象类,继承对象接口
- 添加的一些装饰的组件。‘各种具体的装饰’
使用情况
- 需要执行特殊行为时,客户代码可以根据需要有选择的,有有顺序的使用装饰功能包装对象。
案例说明: 假设现在有一个煎饼店,他们的煎饼原价是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。