原则:对扩展开放,对修改关闭
模式:动态的将责任附加到对象上,想要扩展功能,装饰着有别于继承的另一种选择
缺陷:会出现许多小对象
fun main() {
var ice = Ice(Water())
var tea = Tea(ice)
var red = Red(tea)
print(red.cost())
}
/**
* 饮料的父类
*/
open abstract class BaseBeverage {
var other: BaseBeverage? = null
/**
* 计算价格
*
*/
abstract fun cost(): Double
/***
* 描述
*/
abstract fun getDescribe(): String
/**
* 当前除自己以外的其他饮料价格
*/
fun otherCost(): Double {
if (other != null) {
return other!!.cost()
} else {
return 0.0
}
}
}
/**
* 水
*/
class Water : BaseBeverage {
constructor() {}
constructor(bb: BaseBeverage) : this() {
other = bb
}
override fun cost(): Double {
return ((1.0) + otherCost())
}
override fun getDescribe(): String {
return "水"
}
}
/**
* 冰块
*/
class Ice : BaseBeverage {
constructor() {}
constructor(bb: BaseBeverage) : this() {
other = bb
}
override fun cost(): Double {
return ((3.0) + otherCost())
}
override fun getDescribe(): String {
return "冰"
}
}
/**
* 红色添加剂
*/
class Red : BaseBeverage {
constructor(bb: BaseBeverage) {
other = bb
}
override fun cost(): Double {
return ((5.0) + otherCost())
}
override fun getDescribe(): String {
return "红"
}
}
/**
* 茶水
*/
class Tea : BaseBeverage {
constructor(bb: BaseBeverage) : super() {
other = bb
}
override fun cost(): Double {
return ((3.0) + otherCost())
}
override fun getDescribe(): String {
return "茶"
}
}
代表框架 Rxjava框架