之前看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...
增加了送礼活动.....
增加了满减活动.....