定义
装饰器模式:动态地给一个对象添加额外的职责。
简介
- 装饰器模式属于结构型模式
- 装饰器模式在生活中应用实际也非常广泛,比如想将一间房装饰为厨房,那么就需要在其中添加厨具。
- 通常我们扩展类的功能是通过继承来实现,但是装饰器模式是通过组合的方式来实现的,这是继承的替代方案之一。
代码实例
背景:某果园在采摘完水果之后要将其打包,通过顾客反馈需要在原有的包装上做其他的处理,比如防伪、加固、加急。
装饰框架package 设计模式5
/**
*@Description
*@Author PC
*@QQ 1578684787
*/
/**
* 定义一个类 ->打包
*/
interface Bag{
fun pack()
}
class BagImpl:Bag{
override fun pack() {
}
}
/**
* 创建抽象装饰角色
*/
//维持一个抽象构件对象的引用 bag
abstract class BagDecorator(open val bag:Bag):Bag{
override fun pack() {
println("已经完成初步包装处理")
bag.pack()
}
}
/**
* 创建具体装饰类
*/
class CheckedBagDecorator(override val bag: Bag):BagDecorator(bag){
override fun pack() {
super.pack()//调用原有的包装动作
checked()//打印防伪标记
}
private fun checked(){
println("--------------")
println("打印防伪标记")
}
}
class SpeedBagDecorator(override val bag: Bag):BagDecorator(bag){
override fun pack() {
super.pack()//调用原有的包装动作
speed()//加急服务
}
private fun speed(){
println("--------------")
println("加急服务")
}
}
/**
* 测试
*/
fun main() {
var bag: Bag = BagImpl()
bag = CheckedBagDecorator(bag!!)
bag = SpeedBagDecorator(bag!!)
bag.pack()
}
测试结果
执行结果优点
- 采用组合的方式,可以动态地扩展功能,同时也可以在运行时选择不同的装饰器,来实现不同的功能。
- 有效避免了使用继承的方式扩展对象功能而带来的灵活性差,子类无限制扩张的问题。
- 被装饰者与装饰者解耦,被装饰者可以不知道装饰者的存在,同时新增功能时原有代码也无需改变,符合开放闭合原则。
缺点
- 装饰层过多的话,维护起来比较困难。
- 如果要修改抽象组件这个基类的话,后面一些子类可能也需要跟着修,较容易出错。
应用场景
- 需要扩充一个类的功能,或给一个类增加附加功能时
- 需要动态地给一个对象增加功能,这些功能可以再动态地撤销
- 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。
在Android中的应用:Activity、Service、Application等都是一个Context,这里面实际上就是通过装饰器模式实现的。
参考文章:
Android设计模式-装饰者模式
网友评论